ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDNiOWUxNjAuLjliZDA5OWQgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtODgyLDEzICs4ODIsMTIgQEAKIFM6IFVTQQogCiBOOiBSYW5keSBEdW5sYXAKLUU6IHJkZHVubGFwQG9zZGwub3JnCitFOiByZHVubGFwQHhlbm90aW1lLm5ldAogVzogaHR0cDovL3d3dy54ZW5vdGltZS5uZXQvbGludXgvbGludXguaHRtbAogVzogaHR0cDovL3d3dy5saW51eC11c2Iub3JnCiBEOiBMaW51eC1VU0Igc3Vic3lzdGVtLCBVU0IgY29yZS9VSENJL3ByaW50ZXIvc3RvcmFnZSBkcml2ZXJzCiBEOiB4ODYgU01QLCBBQ1BJLCBib290ZmxhZyBoYWNraW5nCi1TOiAxMjcyNSBTVyBNaWxsaWthbiBXYXksIFN1aXRlIDQwMAotUzogQmVhdmVydG9uLCBPcmVnb24gOTcwMDUKK1M6IChhc2sgZm9yIGN1cnJlbnQgYWRkcmVzcykKIFM6IFVTQQogCiBOOiBCb2IgRHVubG9wCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAppbmRleCAxYWQyNmQyLi4yZjhmMjRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKQEAgLTI1Miw4ICsyNTIsNyBAQAogVGhlcmUgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBhYm92ZS4gIElmIGhvdHBsdWcgZnVudGlvbmFsaXR5IGlzIHVzZWQKIHRvIHJlbW92ZSBhbGwgdGhlIENQVXMgdGhhdCBhcmUgY3VycmVudGx5IGFzc2lnbmVkIHRvIGEgY3B1c2V0LAogdGhlbiB0aGUga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGNwdXNfYWxsb3dlZCBvZiBhbGwKLXRhc2tzIGF0dGFjaGVkIHRvIENQVXMgaW4gdGhhdCBjcHVzZXQgd2l0aCB0aGUgb25saW5lIENQVXMgb2YgdGhlCi1uZWFyZXN0IHBhcmVudCBjcHVzZXQgdGhhdCBzdGlsbCBoYXMgc29tZSBDUFVzIG9ubGluZS4gIFdoZW4gbWVtb3J5Cit0YXNrcyBhdHRhY2hlZCB0byBDUFVzIGluIHRoYXQgY3B1c2V0IHRvIGFsbG93IGFsbCBDUFVzLiAgV2hlbiBtZW1vcnkKIGhvdHBsdWcgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZpbmcgTWVtb3J5IE5vZGVzIGlzIGF2YWlsYWJsZSwgYQogc2ltaWxhciBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYXBwbHkgdGhlcmUgYXMgd2VsbC4gIEluIGdlbmVyYWwsCiB0aGUga2VybmVsIHByZWZlcnMgdG8gdmlvbGF0ZSBjcHVzZXQgcGxhY2VtZW50LCBvdmVyIHN0YXJ2aW5nIGEgdGFzawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmZsZXhjb3AgYi9Eb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZmxleGNvcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBjNzBmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmZsZXhjb3AKQEAgLTAsMCArMSwyMDUgQEAKK1RoaXMgUkVBRE1FIGVzY29ydGVkIHRoZSBza3lzdGFyMi1kcml2ZXIgcmV3cml0aW5nIHByb2NlZHVyZS4gSXQgZGVzY3JpYmVzIHRoZQorc3RhdGUgb2YgdGhlIG5ldyBmbGV4Y29wLWRyaXZlciBzZXQgYW5kIHNvbWUgaW50ZXJuYWxzIGFyZSB3cml0dGVuIGRvd24gaGVyZQordG9vLgorCitUaGlzIGRvY3VtZW50IGhvcGVmdWxseSBkZXNjcmliZXMgdGhpbmdzIGFib3V0IHRoZSBmbGV4Y29wIGFuZCBpdHMKK2RldmljZS1vZmZzcHJpbmdzLiBHb2FsIHdhcyB0byB3cml0ZSBhbiBlYXN5LXRvLXdyaXRlIGFuZCBlYXN5LXRvLXJlYWQgc2V0IG9mCitkcml2ZXJzIGJhc2VkIG9uIHRoZSBza3lzdGFyMi5jIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4KKworUmVtYXJrOiBmbGV4Y29wLXBjaS5jIHdhcyBhIGNvcHkgb2Ygc2t5c3RhcjIuYywgYnV0IGV2ZXJ5IGxpbmUgaGFzIGJlZW4KK3RvdWNoZWQgYW5kIHJld3JpdHRlbi4KKworSGlzdG9yeSAmIE5ld3MKKz09PT09PT09PT09PT09CisgIDIwMDUtMDQtMDEgLSBjb3JyZWN0IFVTQiBJU09DIHRyYW5zZmVycyAodGhhbmtzIHRvIFZhZGltIENhdGFuYSkKKworCisKKworR2VuZXJhbCBjb2RpbmcgcHJvY2Vzc2luZworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZSBzaG91bGQgcHJvY2VlZCBhcyBmb2xsb3dzIChhcyBsb25nIGFzIG5vIG9uZSBjb21wbGFpbnMpOgorCiswKSBUaGluayBiZWZvcmUgc3RhcnQgd3JpdGluZyBjb2RlIQorCisxKSByZXdyaXRpbmcgdGhlIHNreXN0YXIyLmMgd2l0aCB0aGUgaGVscCBvZiB0aGUgZmxleGNvcCByZWdpc3RlciBkZXNjcmlwdGlvbnMKK2FuZCBzcGxpdHRpbmcgdXAgdGhlIGZpbGVzIHRvIGEgcGNpLWJ1cy1wYXJ0IGFuZCBhIGZsZXhjb3AtcGFydC4KK1RoZSBuZXcgZHJpdmVyIHdpbGwgYmUgY2FsbGVkIGIyYzItZmxleGNvcC1wY2kua28vYjJjMi1mbGV4Y29wLXVzYi5rbyBmb3IgdGhlCitkZXZpY2Utc3BlY2lmaWMgcGFydCBhbmQgYjJjMi1mbGV4Y29wLmtvIGZvciB0aGUgY29tbW9uIGZsZXhjb3AtZnVuY3Rpb25zLgorCisyKSBTZWFyY2ggZm9yIGVycm9ycyBpbiB0aGUgbGVmdG92ZXIgb2YgZmxleGNvcC1wY2kuYyAoY29tcGFyZSB3aXRoIHBsdXRvMi5jCithbmQgb3RoZXIgcGNpIGRyaXZlcnMpCisKKzMpIG1ha2Ugc29tZSBiZWF1dGlmaWNhdGlvbiAoc2VlICdJbXByb3ZlbWVudHMgd2hlbiByZXdyaXRpbmcgKHJlZmFjdG9yaW5nKSBpcworZG9uZScpCisKKzQpIFRlc3RpbmcgdGhlIG5ldyBkcml2ZXIgYW5kIG1heWJlIHN1YnN0aXR1dGUgdGhlIHNreXN0YXIyLmMgd2l0aCBpdCwgdG8gcmVhY2gKK2Egd2lkZXIgdGVzdGVyIGF1ZGllbmNlLgorCis1KSBjcmVhdGluZyBhbiB1c2ItYnVzLXBhcnQgdXNpbmcgdGhlIGFscmVhZHkgd3JpdHRlbiBmbGV4Y29wIGNvZGUgZm9yIHRoZSBwY2kKK2NhcmQuCisKK0lkZWE6IGNyZWF0ZSBhIGtlcm5lbC1vYmplY3QgZm9yIHRoZSBmbGV4Y29wIGFuZCBleHBvcnQgYWxsIGltcG9ydGFudAorZnVuY3Rpb25zLiBUaGlzIG9wdGlvbiBzYXZlcyBrZXJuZWwtbWVtb3J5LCBidXQgbWF5YmUgYSBsb3Qgb2YgZnVuY3Rpb25zIGhhdmUKK3RvIGJlIGV4cG9ydGVkIHRvIGtlcm5lbCBuYW1lc3BhY2UuCisKKworQ3VycmVudCBzaXR1YXRpb24KKz09PT09PT09PT09PT09PT09CisKKzApIERvbmUgOikKKzEpIERvbmUgKHNvbWUgbWlub3IgaXNzdWVzIGxlZnQpCisyKSBEb25lCiszKSBOb3QgcmVhZHkgeWV0LCBtb3JlIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeQorNCkgbmV4dCB0byBiZSBkb25lIChzZWUgdGhlIHRhYmxlIGJlbG93KQorNSkgVVNCIGRyaXZlciBpcyB3b3JraW5nICh5ZXMsIHRoZXJlIGFyZSBzb21lIG1pbm9yIGlzc3VlcykKKworV2hhdCBzZWVtcyB0byBiZSByZWFkeT8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEpIFJld3JpdGluZworMWEpIGkyYyBpcyBjdXQgb2ZmIGZyb20gdGhlIGZsZXhjb3AtcGNpLmMgYW5kIHNlZW1zIHRvIHdvcmsKKzFiKSBtb3ZlZCB0dW5lciBhbmQgZGVtb2Qgc3R1ZmYgZnJvbSBmbGV4Y29wLXBjaS5jIHRvIGZsZXhjb3AtdHVuZXItZmUuYworMWMpIG1vdmVkIGxuYiBhbmQgZGlzZXFjIHN0dWZmIGZyb20gZmxleGNvcC1wY2kuYyB0byBmbGV4Y29wLXR1bmVyLWZlLmMKKzFlKSBlZXByb20gKHJlYWRpbmcgTUFDIGFkZHJlc3MpCisxZCkgc3JhbSAobm8gZHluYW1pYyBzbGwgc2l6ZSBkZXRlY3Rpb24gKGNvbW1lbnRlZCBvdXQpICh1c2luZyBkZWZhdWx0IGFzIEpKIHRvbGQgbWUpKQorMWYpIG1pc2MuIHJlZ2lzdGVyIGFjY2Vzc2VzIGZvciByZWFkaW5nIHBhcmFtZXRlcnMgKGUuZy4gcmVzZXR0aW5nLCByZXZpc2lvbikKKzFnKSBwaWQvbWFjIGZpbHRlciAoZmxleGNvcC1ody1maWx0ZXIuYykKKzFpKSBkdmItc3R1ZmYgaW5pdGlhbGl6YXRpb24gaW4gZmxleGNvcC5jIChkb25lKQorMWgpIGRtYSBzdHVmZiAobm93IGp1c3QgdXNpbmcgdGhlIHNpemUtaXJxLCBpbnN0ZWFkIG9mIGFsbC10b2dldGhlciwgdG8gYmUgZG9uZSkKKzFqKSByZW1vdmUgZmxleGNvcCBpbml0aWFsaXphdGlvbiBmcm9tIGZsZXhjb3AtcGNpLmMgY29tcGxldGVseSAoZG9uZSkKKzFsKSB1c2UgYSB3ZWxsIHdvcmtpbmcgZG1hIElSUSBtZXRob2QgKGRvbmUsIHNlZSAnS25vd24gYnVncyBhbmQgcHJvYmxlbXMgYW5kIFRPRE8nKQorMWspIGNsZWFudXAgZmxleGNvcC1maWxlcyAocmVtb3ZlIHVudXNlZCBFWFBPUlRfU1lNQk9McywgbWFrZSBzdGF0aWMgZnJvbQorbm9uLXN0YXRpYyB3aGVyZSBwb3NzaWJsZSwgbW92ZWQgY29kZSB0byBwcm9wZXIgcGxhY2VzKQorCisyKSBTZWFyY2ggZm9yIGVycm9ycyBpbiB0aGUgbGVmdG92ZXIgb2YgZmxleGNvcC1wY2kuYyAocGFydGlhbGx5IGRvbmUpCis1YSkgYWRkIE1BQyBhZGRyZXNzIHJlYWRpbmcKKzVjKSBmZWVkaW5nIG9mIElTT0MgZGF0YSB0byB0aGUgc29mdHdhcmUgZGVtdXggKGZvcm1hdCBvZiB0aGUgaXNvY2hyb25vdXMgZGF0YQorYW5kIHNwZWVkIG9wdGltaXphdGlvbiwgbm8gcmVhbCBlcnJvcikgKHRoYW5rcyB0byBWYWRpbSBDYXRhbmEpCisKK1doYXQgdG8gZG8gaW4gdGhlIG5lYXIgZnV0dXJlPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhubyBzcGVjaWFsIG9yZGVyIGhlcmUpCisKKzUpIFVTQiBkcml2ZXIKKzViKSBvcHRpbWl6ZSBpc29jLXRyYW5zZmVyIChzdWJtaXR0aW5nL2tpbGxpbmcgaXNvYyBVUkJzIHdoZW4gdHJhbnNmZXIgaXMgc3RhcnRpbmcpCisKK1Rlc3RpbmcgY2hhbmdlcworLS0tLS0tLS0tLS0tLS0tCisKK08gICAgICAgICAgICAgPSBpdGVtIGlzIHdvcmtpbmcKK1AgICAgICAgICAgICAgPSBpdGVtIGlzIHBhcnRpYWxseSB3b3JraW5nCitYICAgICAgICAgICAgID0gaXRlbSBpcyBub3Qgd29ya2luZworTiAgICAgICAgICAgICA9IGl0ZW0gZG9lcyBub3QgYXBwbHkgaGVyZQorPGVtcHR5IGZpZWxkPiA9IGl0ZW0gbmVlZCB0byBiZSBleGFtaW5lZAorCisgICAgICAgfCBQQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVU0IKK2l0ZW0gICB8IG10MzUyIHwgbnh0MjAwMiB8IHN0djAyOTkgfCBtdDMxMiB8IG10MzUyIHwgbnh0MjAwMiB8IHN0djAyOTkgfCBtdDMxMgorLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLQorMWEpICAgIHwgTyAgICAgfCAgICAgICAgIHwgICAgICAgICB8ICAgICAgIHwgTiAgICAgfCBOICAgICAgIHwgTiAgICAgICB8IE4KKzFiKSAgICB8IE8gICAgIHwgICAgICAgICB8ICAgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgICB8IE8gICAgICAgfAorMWMpICAgIHwgTiAgICAgfCBOICAgICAgIHwgICAgICAgICB8ICAgICAgIHwgTiAgICAgfCBOICAgICAgIHwgTyAgICAgICB8CisxZCkgICAgfCAgICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgTworMWUpICAgIHwgICAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIE8KKzFmKSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQCisxZykgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTworMWgpICAgIHwgICAgICAgICAgICAgICAgIFAgICAgICAgICAgICAgICAgIHwKKzFpKSAgICB8ICAgICAgICAgICAgICAgICBPICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICBOCisxaikgICAgfCAgICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgTgorMWwpICAgIHwgICAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIE4KKzIpICAgICB8ICAgICAgICAgICAgICAgICBPICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICBOCis1YSkgICAgfCAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgTworNWIpKiAgIHwgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgIHwKKzVjKSAgICB8ICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICBPCisKKyogLSBub3QgZG9uZSB5ZXQKKworS25vd24gYnVncyBhbmQgcHJvYmxlbXMgYW5kIFRPRE8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzFnL2gvbCkgd2hlbiBwaWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQgb24gdGhlIHBjaSBjYXJkCisKK0RNQSB1c2FnZSBjdXJyZW50bHk6CisgIFRoZSBETUEgaXMgc3BsaXR0ZWQgaW4gMiBlcXVhbC1zaXplZCBzdWJidWZmZXJzLiBUaGUgRmxleGNvcCB3cml0ZXMgdG8gZmlyc3QKKyAgYWRkcmVzcyBhbmQgdHJpZ2dlcnMgYW4gSVJRIHdoZW4gaXQncyBmdWxsIGFuZCBzdGFydHMgd3JpdGluZyB0byB0aGUgc2Vjb25kCisgIGFkZHJlc3MuIFdoZW4gdGhlIHNlY29uZCBhZGRyZXNzIGlzIGZ1bGwsIHRoZSBJUlEgaXMgdHJpZ2dlcmVkIGFnYWluLCBhbmQKKyAgdGhlIGZsZXhjb3Agd3JpdGVzIHRvIGZpcnN0IGFkZHJlc3MgYWdhaW4sIGFuZCBzbyBvbi4KKyAgVGhlIGJ1ZmZlcnNpemUgb2YgZWFjaCBhZGRyZXNzIGlzIGN1cnJlbnRseSA2NDAqMTg4IGJ5dGVzLgorCisgIFByb2JsZW0gaXMsIHdoZW4gdXNpbmcgaHctcGlkLWZpbHRlcmluZyBhbmQgZG9pbmcgc29tZSBsb3ctYmFuZHdpZHRoCisgIG9wZXJhdGlvbiAobGlrZSBzY2FubmluZykgdGhlIGJ1ZmZlcnMgd29uJ3QgYmUgZmlsbGVkIGVub3VnaCB0byB0cmlnZ2VyCisgIHRoZSBJUlEuIFRoYXQncyB3aHk6CisKKyAgV2hlbiBQSUQgZmlsdGVyaW5nIGlzIGFjdGl2YXRlZCwgdGhlIHRpbWVyIElSUSBpcyB1c2VkLiBFdmVyeSAxLjk3IG1zIHRoZSBJUlEKKyAgaXMgdHJpZ2dlcmVkLiAgSXMgdGhlIGN1cnJlbnQgd3JpdGUgYWRkcmVzcyBvZiBETUExIGRpZmZlcmVudCB0byB0aGUgb25lCisgIGR1cmluZyB0aGUgbGFzdCBJUlEsIHRoZW4gdGhlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBkZW11eGVyLgorCisgIFRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgRE1BLUlSUS1tZXRob2Q6IHBhY2tldCBjb3VudCBJUlEuIFRoaXMgaXNuJ3QKKyAgaW1wbGVtZW50ZWQgY29ycmVjdGx5IHlldC4KKworICBUaGUgc29sdXRpb24gaXMgdG8gZGlzYWJsZSBIVyBQSUQgZmlsdGVyaW5nLCBidXQgSSBkb24ndCBrbm93IGhvdyB0aGUgRFZCCisgIEFQSSBzb2Z0d2FyZSBkZW11eCBiZWhhdmVzIG9uIHNsb3cgc3lzdGVtcyB3aXRoIDQ1TUJpdC9zIFRTLgorCitTb2x2ZWQgYnVncyA6KQorLS0tLS0tLS0tLS0tLS0KKzFnKSBwaWQtZmlsdGVyaW5nIChzb21laG93IHBpZCBpbmRleCA0IGFuZCA1IChFTU1fUElEIGFuZCBFQ01fUElEKSBhcmVuJ3QKK3dvcmtpbmcpCitTT0xVVElPTjogYWxzbyBpbmRleCAwIHdhcyBhZmZlY3RlZCwgYmVjYXVzZSBuZXRfdHJhbnNsYXRpb24gaXMgZG9uZSBmb3IKK3RoZXNlIGluZGV4ZXMgYnkgZGVmYXVsdAorCis1YikgaXNvY2hyb25vdXMgdHJhbnNmZXIgZG9lcyBvbmx5IHdvcmsgaW4gdGhlIGZpcnN0IGF0dGVtcHQgKGZvciB0aGUgU2t5MlBDCitVU0IsIEFpcjJQQyBpcyB3b3JraW5nKSBTT0xVVElPTjogdGhlIGZsZXhjb3Agd2FzIGdvaW5nIGFzbGVlcCBhbmQgbmV2ZXIgcmVhbGx5Cit3b2tlIHVwIGFnYWluIChkb24ndCBrbm93IGlmIHRoaXMgbmVlZCBmaXhlcywgc2VlCitmbGV4Y29wLWZlLXR1bmVyLmM6ZmxleGNvcF9zbGVlcCkKKworTkVXUzogd2hlbiB0aGUgZHJpdmVyIGlzIGxvYWRlZCBhbmQgdW5sb2FkZWQgYW5kIGxvYWRlZCBhZ2FpbiAody9vIGRvaW5nCithbnl0aGluZyBpbiB0aGUgd2hpbGUgdGhlIGRyaXZlciBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUpLCBubyB0cmFuc2ZlcnMgdGFrZQorcGxhY2UgYW55bW9yZS4KKworSW1wcm92ZW1lbnRzIHdoZW4gcmV3cml0aW5nIChyZWZhY3RvcmluZykgaXMgZG9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCistIHNwbGl0IHNsZWVwaW5nIG9mIHRoZSBmbGV4Y29wIChtaXNjXzIwNC5BQ1BJM19zaWcgPSAxOykgZnJvbSBsbmJfY29udHJvbAorICAoZW5hYmxlIHNsZWVwaW5nIGZvciBvdGhlciBkZW1vZHMgdGhhbiBkdmItcykKKy0gYWRkIHN1cHBvcnQgZm9yIENhYmxlU3RhciAoc3R2MDI5NyBNaWNyb3R1bmUgMjAzeC9BTFBTKSAoYWxtb3N0IGRvbmUsIGluY29tcGF0aWJpbGl0aWVzIHdpdGggdGhlIE5leHVzLUNBKQorCitEZWJ1Z2dpbmcKKy0tLS0tLS0tLQorLSBhZGQgdmVyYm9zZSBkZWJ1Z2dpbmcgdG8gc2t5c3RhcjIuYyAoZHVtcCB0aGUgcmVnX2R3X2RhdGEpIGFuZCBjb21wYXJlIGl0CisgIHdpdGggdGhpcyBmbGV4Y29wLCB0aGlzIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpMmMgaXMgbm93IHVzaW5nIHRoZQorICBmbGV4Y29wX2liaV92YWx1ZSB1bmlvbiBmcm9tIGZsZXhjb3AtcmVnLmggKGRvIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yCisgIHRoYXQsIHBsZWFzZSB0ZWxsIHVzIHNvKS4KKworRXZlcnl0aGluZyB3aGljaCBpcyBpZGVudGljYWwgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgY2FuIGJlIHB1dCBpbnRvIGEgY29tbW9uCitmbGV4Y29wLW1vZHVsZS4KKworICAgICAgICAgICAgICAgICAgUENJICAgICAgICAgICAgICAgICAgVVNCCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEaWZmZXJlbnQ6CitSZWdpc3RlciBhY2Nlc3M6ICBhY2Nlc3NpbmcgSU8gbWVtb3J5ICBVU0IgY29udHJvbCBtZXNzYWdlCitJMkMgYnVzOiAgICAgICAgICBJMkMgYnVzIG9mIHRoZSBGQyAgICBVU0IgY29udHJvbCBtZXNzYWdlCitEYXRhIHRyYW5zZmVyOiAgICBETUEgICAgICAgICAgICAgICAgICBpc29jaHJvbm91cyB0cmFuc2ZlcgorRUVQUk9NIHRyYW5zZmVyOiAgdGhyb3VnaCBpMmMgYnVzICAgICAgbm90IGNsZWFyIHlldAorCitJZGVudGljYWw6CitTdHJlYW1pbmc6ICAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgcmVnaXN0ZXJzCitQSUQgRmlsdGVyaW5nOiAgICAgICAgICAgICBhY2Nlc3NpbmcgcmVnaXN0ZXJzCitTcmFtIGRlc3RpbmF0aW9uczogICAgICAgICBhY2Nlc3NpbmcgcmVnaXN0ZXJzCitUdW5lci9EZW1vZDogICAgICAgICAgICAgICAgICAgICBJMkMgYnVzCitEVkItc3R1ZmY6ICAgICAgICAgICAgY2FuIGJlIHdyaXR0ZW4gZm9yIGNvbW1vbiB1c2UKKworQWNrbm93bGVkZ2VtZW50cyAoanVzdCBmb3IgdGhlIHJld3JpdGluZyBwYXJ0KQorPT09PT09PT09PT09PT09PQorCitCamFybmUgU3RlaW5zYm8gdGhvdWdodCBhIGxvdCBpbiB0aGUgZmlyc3QgcGxhY2Ugb2YgdGhlIHBjaSBwYXJ0IGZvciB0aGlzIGNvZGUKK3NoYXJpbmcgaWRlYS4KKworQW5kcmVhcyBPYmVycml0dGVyIGZvciBwcm92aWRpbmcgYSByZWNlbnQgUENJIGluaXRpYWxpemF0aW9uIHRlbXBsYXRlCisocGx1dG8yLmMpLgorCitCb2xlc2xhdyBDaWVzaWVsc2tpIGZvciBwb2ludGluZyBvdXQgYSBwcm9ibGVtIHdpdGggZmlybXdhcmUgbG9hZGVyLgorCitWYWRpbSBDYXRhbmEgZm9yIGNvcnJlY3RpbmcgdGhlIFVTQiB0cmFuc2Zlci4KKworY29tbWVudHMsIGNyaXRpY3MgYW5kIGlkZWFzIHRvIGxpbnV4LWR2YkBsaW51eHR2Lm9yZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dAppbmRleCBlM2NhY2Y0Li5kNjQ0MzBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CkBAIC0xNyw3NCArMTcsNTMgQEAKICJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIKICAgPT4gIlZpZGVvIEZvciBMaW51eCIgPT4gIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKIAorRnVydGhlcm1vcmUgeW91IG5lZWQgdG8gZW5hYmxlCisiRGV2aWNlIGRyaXZlcnMiID0+ICJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzIgorICA9PiAiRFZCIGZvciBMaW51eCIgIkRWQiBDb3JlIFN1cHBvcnQiICJOZWJ1bGEvUGlubmFjbGUgUENUVi9Ud2luSGFuIFBDSSBDYXJkcyIKKwogMikgTG9hZGluZyBNb2R1bGVzCiA9PT09PT09PT09PT09PT09PT0KIAogSW4gZ2VuZXJhbCB5b3UgbmVlZCB0byBsb2FkIHRoZSBidHR2IGRyaXZlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGdwaW8gYW5kCi1pMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMuIE5leHQgeW91IG5lZWQgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlcgotYW5kIG9uZSBmcm9udGVuZCBkcml2ZXIuCi0KLVRoZSBidHR2IGRyaXZlciB3aWxsIEhBTkcgWU9VUiBTWVNURU0gSUYgWU9VIERPIE5PVCBTUEVDSUZZIFRIRSBDT1JSRUNUIAotQ0FSRCBJRCEKLQotKElmIHlvdSBkb24ndCBnZXQgeW91ciBjYXJkIHJ1bm5pbmcgYW5kIHlvdSBzdXNwZWN0IHRoYXQgdGhlIGNhcmQgaWQgeW91J3JlCi11c2luZyBpcyB3cm9uZywgaGF2ZSBhIGxvb2sgYXQgImJ0dHYtY2FyZHMuYyIgZm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBjYXJkCi1pZHMuKQotCi1QYXkgYXR0ZW50aW9uIHRvIGZhaWx1cmVzIHdoZW4geW91IGxvYWQgdGhlIGZyb250ZW5kIGRyaXZlcnMKLShlLmcuIGRtZXNnLCAvdmFyL2xvZy9tZXNzYWdlcykuCitpMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlci4KK1RoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSAobnh0NjAwMCksIFBpbm5hY2xlIFBDVFYgKGN4MjQxMTApIGFuZAorVHdpbkhhbiAoZHN0KSBhcmUgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLgogCiAzYSkgTmVidWxhIC8gUGlubmFjbGUgUENUVgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgJCBtb2Rwcm9iZSBidHR2IGkyY19odz0xIGNhcmQ9MHg2OAotICAgJCBtb2Rwcm9iZSBkdmItYnQ4eHgKLSAgIAotRm9yIE5lYnVsYSBjYXJkcyB1c2UgdGhlICJueHQ2MDAwIiBmcm9udGVuZCBkcml2ZXI6Ci0gICAkIG1vZHByb2JlIG54dDYwMDAKKyAgICQgbW9kcHJvYmUgYnR0diAobm9ybWFsbHkgYnR0diBpcyBiZWluZyBsb2FkZWQgYXV0b21hdGljYWxseSBieSBrbW9kKQorICAgJCBtb2Rwcm9iZSBkdmItYnQ4eHggKG9yIGp1c3QgcGxhY2UgZHZiLWJ0OHh4IGluIC9ldGMvbW9kdWxlcyBmb3IgYXV0b21hdGljIGxvYWRpbmcpCiAKLUZvciBQaW5uYWNsZSBQQ1RWIGNhcmRzIHVzZSB0aGUgImN4MjQxMTAiIGZyb250ZW5kIGRyaXZlcjoKLSAgICQgbW9kcHJvYmUgY3gyNDExMAogCi0zYikgVHdpbkhhbgotLS0tLS0tLS0tLS0KKzNiKSBUd2luSGFuIGFuZCBDbG9uZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICQgbW9kcHJvYmUgYnR0diBpMmNfaHc9MSBjYXJkPTB4NzEKICAgICQgbW9kcHJvYmUgZHZiLWJ0OHh4CiAgICAkIG1vZHByb2JlIGRzdAogCi1UaGUgdmFsdWUgMHg3MSB3aWxsIG92ZXJyaWRlIHRoZSBQQ0kgdHlwZSBkZXRlY3Rpb24gZm9yIGR2Yi1idDh4eCwgd2hpY2ggCi1pcyBuZWNlc3NhcnkgZm9yIFR3aW5IYW4gY2FyZHMuIworVGhlIHZhbHVlIDB4NzEgd2lsbCBvdmVycmlkZSB0aGUgUENJIHR5cGUgZGV0ZWN0aW9uIGZvciBkdmItYnQ4eHgsCit3aGljaCAgaXMgbmVjZXNzYXJ5IGZvciBUd2luSGFuIGNhcmRzLgogCi1JZiB5b3UncmUgaGF2aW5nIGFuIG9sZGVyIGNhcmQgKGJsdWUgY29sb3IgY2lyY3VpdCkgYW5kIGNhcmQ9MHg3MSBsb2NrcyB5b3VyCi1tYWNoaW5lLCB0cnkgdXNpbmcgMHg2OCwgdG9vLiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGFzayBvbiB0aGUgRFZCIG1haWxpbmcgbGlzdC4KK0lmIHlvdSdyZSBoYXZpbmcgYW4gb2xkZXIgY2FyZCAoYmx1ZSBjb2xvciBjaXJjdWl0KSBhbmQgY2FyZD0weDcxIGxvY2tzCit5b3VyIG1hY2hpbmUsIHRyeSB1c2luZyAweDY4LCB0b28uIElmIHRoYXQgZG9lcyBub3Qgd29yaywgYXNrIG9uIHRoZQorbWFpbGluZyBsaXN0LgogCi1UaGUgRFNUIG1vZHVsZSB0YWtlcyBhIGNvdXBsZSBvZiB1c2VmdWwgcGFyYW1ldGVycywgaW4gY2FzZSB0aGUKLWRzdCBkcml2ZXJzIGZhaWxzIHRvIGRldGVjdCB5b3VyIHR5cGUgb2YgY2FyZCBjb3JyZWN0bHkuCitUaGUgRFNUIG1vZHVsZSB0YWtlcyBhIGNvdXBsZSBvZiB1c2VmdWwgcGFyYW1ldGVycy4KIAotZHN0X3R5cGUgdGFrZXMgdmFsdWVzIDAgKHNhdGVsbGl0ZSksIDEgKHRlcnJlc3RpYWwgVFYpLCAyIChjYWJsZSkuCit2ZXJib3NlIHRha2VzIHZhbHVlcyAwIHRvIDUuIFRoZXNlIHZhbHVlcyBjb250cm9sIHRoZSB2ZXJib3NpdHkgbGV2ZWwuCiAKLWRzdF90eXBlX2ZsYWdzIHRha2VzIGJpdCBjb21iaW5lZCB2YWx1ZXM6Ci0xID0gbmV3IHR1bmVyIHR5cGUgcGFja2V0cy4gWW91IGNhbiB1c2UgdGhpcyBpZiB5b3VyIGNhcmQgaXMgZGV0ZWN0ZWQKLSAgICBhbmQgeW91IGhhdmUgZGVidWcgYW5kIHlvdSBjb250aW51YWxseSBzZWUgdGhlIHR1bmVyIHBhY2tldHMgbm90Ci0gICAgd29ya2luZyAobWFrZSBzdXJlIG5vdCBhIGJhc2ljIHByb2JsZW0gbGlrZSBkaXNoIGFsaWdubWVudCBldGMuKQorZGVidWcgdGFrZXMgdmFsdWVzIDAgYW5kIDEuIFlvdSBjYW4gZWl0aGVyIGRpc2FibGUgb3IgZW5hYmxlIGRlYnVnZ2luZy4KIAotMiA9IFRTIDIwNC4gSWYgeW91ciBjYXJkIHR1bmVzIE9LLCBidXQgdGhlIHBpY3R1cmUgaXMgdGVycmlibGUsIHNlZW1pbmdseQotICAgIGJyZWFraW5nIHVwIGluIG9uZSBoYWxmIGNvbnRpbnVhbGx5LCBhbmQgY3JjIGZhaWxzIGEgbG90LCB0aGVuCi0gICAgdGhpcyBpcyB3b3J0aCBhIHRyeSAob3IgdHJ5aW5nIHRvIHR1cm4gb2ZmKQorZHN0X2FkZG9ucyB0YWtlcyB2YWx1ZXMgMCBhbmQgMHgyMC4gQSB2YWx1ZSBvZiAwIG1lYW5zIGl0IGlzIGEgRlRBIGNhcmQuCisweDIwIG1lYW5zIGl0IGhhcyBhIENvbmRpdGlvbmFsIEFjY2VzcyBzbG90LgogCi00ID0gaGFzIHN5bWRpdi4gU29tZSBjYXJkcywgbW9zdGx5IHdpdGhvdXQgbmV3IHR1bmVyIHBhY2tldHMsIHJlcXVpcmUKLSAgICBhIHN5bWJvbCBkaXZpc2lvbiBhbGdvcml0aG0uIERvZXNuJ3QgYXBwbHkgdG8gdGVycmVzdGlhbCBUVi4KLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB2YWx1ZSB0byBoYXZlIHRoZSBhdXRvZGV0ZWN0ZWQgdmFsdWVzIHR1cm5lZCBvZmYKLShlLmcuIDApLiBUaGUgYXV0b2RlY3RlZCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnl0aGUgY2FyZHMgJ3Jlc3BvbnNlCitUaGUgYXV0b2RlY3RlZCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnl0aGUgY2FyZHMgJ3Jlc3BvbnNlCiBzdHJpbmcnIHdoaWNoIHlvdSBjYW4gc2VlIGluIHlvdXIgbG9ncyBlLmcuCiAKLWRzdF9jaGVja19jaTogcmVjb2duaXplIERTVC1NT1QKK2RzdF9nZXRfZGV2aWNlX2lkOiBSZWNvZ25pc2UgW0RTVE1DSV0KIAotb3IgCi0KLWRzdF9jaGVja19jaTogdW5hYmxlIHRvIHJlY29nbml6ZSBEU1RYQ0kgb3IgU1RYQ0kKIAogLS0KLUF1dGhvcnM6IFJpY2hhcmQgV2Fsa2VyLCBKYW1pZSBIb25hbiwgTWljaGFlbCBIdW5vbGQKK0F1dGhvcnM6IFJpY2hhcmQgV2Fsa2VyLCBKYW1pZSBIb25hbiwgTWljaGFlbCBIdW5vbGQsIE1hbnUgQWJyYWhhbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTA3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQKQEAgLTAsMCArMSwyMTkgQEAKKyogRm9yIHRoZSB1c2VyCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorTk9URTogVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHVzYWdlIG9mIHRoZSBoaWdoIGxldmVsIENJIEFQSSBhcworaW4gYWNjb3JkYW5jZSB0byB0aGUgTGludXggRFZCIEFQSS4gVGhpcyBpcyBhIG5vdCBhIGRvY3VtZW50YXRpb24gZm9yIHRoZSwKK2V4aXN0aW5nIGxvdyBsZXZlbCBDSSBBUEkuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyB1dGlsaXplIHRoZSBIaWdoIExldmVsIENJIGNhcGFiaWxpdGllcywKKworKDEqKSBUaGlzIHBvaW50IGlzIHZhbGlkIG9ubHkgZm9yIHRoZSBUd2luaGFuL2Nsb25lcworICBGb3IgdGhlIFR3aW5oYW4vVHdpbmhhbiBjbG9uZXMsIHRoZSBkc3RfY2EgbW9kdWxlIGhhbmRsZXMgdGhlIENJCisgIGhhcmR3YXJlIGhhbmRsaW5nLlRoaXMgbW9kdWxlIGlzIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGlmIGEgQ0kKKyAgKENvbW1vbiBJbnRlcmZhY2UsIHRoYXQgaG9sZHMgdGhlIENBTSAoQ29uZGl0aW9uYWwgQWNjZXNzIE1vZHVsZSkKKyAgaXMgZGV0ZWN0ZWQuCisKKygyKSBvbmUgcmVxdWlyZXMgYSB1c2Vyc3BhY2UgYXBwbGljYXRpb24sIGNhX3phcC4gVGhpcyBzbWFsbCB1c2VybGFuZAorICBhcHBsaWNhdGlvbiBpcyBpbiBjaGFyZ2Ugb2Ygc2VuZGluZyB0aGUgZGVzY3JhbWJsaW5nIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAgdG8gdGhlIENBTS4KKworVGhpcyBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHRvIGZ1bmN0aW9uIHByb3Blcmx5IGFzIG9mIG5vdy4KKworCShhKSBUdW5lIHRvIGEgdmFsaWQgY2hhbm5lbCwgd2l0aCBzemFwLgorCSAgZWc6ICQgc3phcCAtYyBjaGFubmVscy5jb25mIC1yICJUTUMiIC14CisKKwkoYikgYSBjaGFubmVscy5jb25mIGNvbnRhaW5pbmcgYSB2YWxpZCBQTVQgUElECisKKwkgIGVnOiBUTUM6MTE5OTY6aDowOjI3NTAwOjI3ODo1MTI6NjUwOjMyMQorCisJICBoZXJlIDI3OCBpcyBhIHZhbGlkIFBNVCBQSUQuIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIHRoZQorCSAgc2FtZSBvbmVzIHRoYXQgc3phcCB1c2VzLgorCisJKGMpIGFmdGVyIHJ1bm5pbmcgYSBzemFwLCB5b3UgaGF2ZSB0byBydW4gY2FfemFwLCBmb3IgdGhlCisJICBkZXNjcmFtYmxlciB0byBmdW5jdGlvbiwKKworCSAgZWc6ICQgY2FfemFwIHBhdGNoZWRfY2hhbm5lbHMuY29uZiAiVE1DIgorCisJICBUaGUgcGF0Y2hlZCBtZWFucyBhIHBhdGNoIHRvIGFwcGx5IHRvIHNjYW4sIHN1Y2ggdGhhdCBzY2FuIGNhbgorCSAgZ2VuZXJhdGUgYSBjaGFubmVscy5jb25mX3dpdGggcG10LCB3aGljaCBoYXMgdGhpcyBQTVQgUElEIGluZm8KKwkgIChOT1RFOiBzemFwIGNhbm5vdCB1c2UgdGhpcyBjaGFubmVscy5jb25mIHdpdGggdGhlIFBNVF9QSUQpCisKKworCShkKSBIb3BlZmxseSBFbmpveSB5b3VyIGZhdm91cml0ZSBzdWJzY3JpYmVkIGNoYW5uZWwgYXMgeW91IGRvIHdpdGgKKwkgIGEgRlRBIGNhcmQuCisKKygzKSBDdXJyZW50bHkgY2FfemFwLCBhbmQgZHN0X3Rlc3QsIGJvdGggYXJlIG1lYW50IGZvciBkZW1vbnN0cmF0aW9uCisgIHB1cnBvc2VzIG9ubHksIHRoZXkgY2FuIGJlY29tZSBmdWxsIGZsZWRnZWQgYXBwbGljYXRpb25zIGlmIG5lY2Vzc2FyeS4KKworCisqIENhcmRzIHRoYXQgZmFsbCBpbiB0aGlzIGNhdGVnb3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorQXQgcHJlc2VudCB0aGUgY2FyZHMgdGhhdCBmYWxsIGluIHRoaXMgY2F0ZWdvcnkgYXJlIHRoZSBUd2luaGFuIGFuZCBpdCdzCitjbG9uZXMsIHRoZXNlIGNhcmRzIGFyZSBhdmFpbGFibGUgYXMgVlZNRVIsIFRvbWF0bywgSGVyY3VsZXMsIE9yYW5nZSBhbmQKK3NvIG9uLgorCisqIENJIG1vZHVsZXMgdGhhdCBhcmUgc3VwcG9ydGVkCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIENJIG1vZHVsZSBzdXBwb3J0IGlzIGxhcmdlbHkgZGVwZW5kYW50IHVwb24gdGhlIGZpcm13YXJlIG9uIHRoZSBjYXJkcworU29tZSBjYXJkcyBkbyBzdXBwb3J0IGFsbW9zdCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBDSSBtb2R1bGVzLiBUaGVyZSBpcworbm90aGluZyBtdWNoIHRoYXQgY2FuIGJlIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBhZGRpdGlvbmFsIENJIG1vZHVsZXMKK3dvcmtpbmcgd2l0aCB0aGVzZSBjYXJkcy4KKworTW9kdWxlcyB0aGF0IGhhdmUgYmVlbiB0ZXN0ZWQgYnkgdGhpcyBkcml2ZXIgYXQgcHJlc2VudCBhcmUKKworKDEpIElyZGV0byAxIGFuZCAyIGZyb20gU0NNCisoMikgVmlhY2Nlc3MgZnJvbSBTQ00KKygzKSBEcmFnb25jYW0KKworKiBUaGUgSGlnaCBsZXZlbCBDSSBBUEkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyogRm9yIHRoZSBwcm9ncmFtbWVyCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorV2l0aCB0aGUgSGlnaCBMZXZlbCBDSSBhcHByb2FjaCBhbnkgbmV3IGNhcmQgd2l0aCBhbG1vc3QgYW55IHJhbmRvbQorYXJjaGl0ZWN0dXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoaXMgc3R5bGUsIHRoZSBkZWZpbml0aW9ucworaW5zaWRldGhlIHN3aXRjaCBzdGF0ZW1lbnQgY2FuIGJlIGVhc2lseSBhZGFwdGVkIGZvciBhbnkgY2FyZCwgdGhlcmVieQorZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGFueSBhZGRpdGlvbmFsIGlvY3Rscy4KKworVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIHRvIG1hbmFnZSB0aGUgcmVzdC4gRm9yCit0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciBpdCB3b3VsZCBiZSBhcyBzaW1wbGUgYXMgc2VuZGluZy9yZWNlaXZpbmcgYW4KK2FycmF5IHRvL2Zyb20gdGhlIENJIGlvY3RscyBhcyBkZWZpbmVkIGluIHRoZSBMaW51eCBEVkIgQVBJLiBObyBjaGFuZ2VzCitoYXZlIGJlZW4gbWFkZSBpbiB0aGUgQVBJIHRvIGFjY29tb2RhdGUgdGhpcyBmZWF0dXJlLgorCisKKyogV2h5IHRoZSBuZWVkIGZvciBhbm90aGVyIENJIGludGVyZmFjZSA/Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhpcyBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9ubHkgYXNrZWQgcXVlc3Rpb24uIFdlbGwgYSBuaWNlIHF1ZXN0aW9uLgorU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpcyBub3QgYSBuZXcgaW50ZXJmYWNlLgorCitUaGUgQ0kgaW50ZXJmYWNlIGlzIGRlZmluZWQgaW4gdGhlIERWQiBBUEkgaW4gY2EuaCBhcworCit0eXBlZGVmIHN0cnVjdCBjYV9zbG90X2luZm8geworCWludCBudW07ICAgICAgICAgICAgICAgLyogc2xvdCBudW1iZXIgKi8KKworCWludCB0eXBlOyAgICAgICAgICAgICAgLyogQ0EgaW50ZXJmYWNlIHRoaXMgc2xvdCBzdXBwb3J0cyAqLworI2RlZmluZSBDQV9DSSAgICAgICAgICAgIDEgICAgIC8qIENJIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIENBX0NJX0xJTksgICAgICAgMiAgICAgLyogQ0kgbGluayBsYXllciBsZXZlbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0FfQ0lfUEhZUyAgICAgICA0ICAgICAvKiBDSSBwaHlzaWNhbCBsYXllciBsZXZlbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0FfREVTQ1IgICAgICAgICA4ICAgICAvKiBidWlsdC1pbiBkZXNjcmFtYmxlciAqLworI2RlZmluZSBDQV9TQyAgICAgICAgICAxMjggICAgIC8qIHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAqLworCisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8qIG1vZHVsZSAob3IgY2FyZCkgaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgQ0FfQ0lfTU9EVUxFX1JFQURZICAgMgorfSBjYV9zbG90X2luZm9fdDsKKworCisKK1RoaXMgQ0kgaW50ZXJmYWNlIGZvbGxvd3MgdGhlIENJIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlLCB3aGljaCBpcyBub3QKK2ltcGxlbWVudGVkIGJ5IG1vc3QgYXBwbGljYXRpb25zLiBIZW5jZSB0aGlzIGFyZWEgaXMgcmV2aXNpdGVkLgorCitUaGlzIENJIGludGVyZmFjZSBpcyBxdWl0ZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2UgdGhhdCBpdCB0cmllcyB0bworYWNjb21vZGF0ZSBhbGwgb3RoZXIgQ0kgYmFzZWQgZGV2aWNlcywgdGhhdCBmYWxsIGludG8gdGhlIG90aGVyIGNhdGVnb3JpZXMKKworVGhpcyBtZWFucyB0aGF0IHRoaXMgQ0kgaW50ZXJmYWNlIGhhbmRsZXMgdGhlIEVONTAyMjEgc3R5bGUgdGFncyBpbiB0aGUKK0FwcGxpY2F0aW9uIGxheWVyIG9ubHkgYW5kIG5vIHNlc3Npb24gbWFuYWdlbWVudCBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZQorYXBwbGljYXRpb24uIFRoZSBkcml2ZXIvaGFyZHdhcmUgd2lsbCB0YWtlIGNhcmUgb2YgYWxsIHRoYXQuCisKK1RoaXMgaW50ZXJmYWNlIGlzIHB1cmVseSBhbiBFTjUwMjIxIGludGVyZmFjZSBleGNoYW5naW5nIEFQRFUncy4gVGhpcworbWVhbnMgdGhhdCBubyBzZXNzaW9uIG1hbmFnZW1lbnQsIGxpbmsgbGF5ZXIgb3IgYSB0cmFuc3BvcnQgbGF5ZXIgZG8KK2V4aXN0IGluIHRoaXMgY2FzZSBpbiB0aGUgYXBwbGljYXRpb24gdG8gZHJpdmVyIGNvbW11bmljYXRpb24uIEl0IGlzCithcyBzaW1wbGUgYXMgdGhhdC4gVGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgdG8gdGFrZSBjYXJlIG9mIHRoYXQuCisKKworV2l0aCB0aGlzIEhpZ2ggTGV2ZWwgQ0kgaW50ZXJmYWNlLCB0aGUgaW50ZXJmYWNlIGNhbiBiZSBkZWZpbmVkIHdpdGggdGhlCityZWd1bGFyIGlvY3Rscy4KKworQWxsIHRoZXNlIGlvY3RscyBhcmUgYWxzbyB2YWxpZCBmb3IgdGhlIEhpZ2ggbGV2ZWwgQ0kgaW50ZXJmYWNlCisKKyNkZWZpbmUgQ0FfUkVTRVQgICAgICAgICAgX0lPKCdvJywgMTI4KQorI2RlZmluZSBDQV9HRVRfQ0FQICAgICAgICBfSU9SKCdvJywgMTI5LCBjYV9jYXBzX3QpCisjZGVmaW5lIENBX0dFVF9TTE9UX0lORk8gIF9JT1IoJ28nLCAxMzAsIGNhX3Nsb3RfaW5mb190KQorI2RlZmluZSBDQV9HRVRfREVTQ1JfSU5GTyBfSU9SKCdvJywgMTMxLCBjYV9kZXNjcl9pbmZvX3QpCisjZGVmaW5lIENBX0dFVF9NU0cgICAgICAgIF9JT1IoJ28nLCAxMzIsIGNhX21zZ190KQorI2RlZmluZSBDQV9TRU5EX01TRyAgICAgICBfSU9XKCdvJywgMTMzLCBjYV9tc2dfdCkKKyNkZWZpbmUgQ0FfU0VUX0RFU0NSICAgICAgX0lPVygnbycsIDEzNCwgY2FfZGVzY3JfdCkKKyNkZWZpbmUgQ0FfU0VUX1BJRCAgICAgICAgX0lPVygnbycsIDEzNSwgY2FfcGlkX3QpCisKKworT24gcXVlcnlpbmcgdGhlIGRldmljZSwgdGhlIGRldmljZSB5aWVsZHMgaW5mb3JtYXRpb24gdGh1cworCitDQV9HRVRfU0xPVF9JTkZPCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21tYW5kID0gW2luZm9dCitBUFA6IE51bWJlcj1bMV0KK0FQUDogVHlwZT1bMV0KK0FQUDogZmxhZ3M9WzFdCitBUFA6IENJIEhpZ2ggbGV2ZWwgaW50ZXJmYWNlCitBUFA6IENBL0NJIE1vZHVsZSBQcmVzZW50CisKK0NBX0dFVF9DQVAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbW1hbmQgPSBbY2Fwc10KK0FQUDogU2xvdHM9WzFdCitBUFA6IFR5cGU9WzFdCitBUFA6IERlc2NyYW1ibGVyIGtleXM9WzE2XQorQVBQOiBUeXBlPVsxXQorCitDQV9TRU5EX01TRworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGVzY3JpcHRvcnMoUHJvZ3JhbSBMZXZlbCk9WyAwOSAwNiAwNiAwNCAwNSA1MCBmZiBmMV0KK0ZvdW5kIENBIGRlc2NyaXB0b3IgQCBwcm9ncmFtIGxldmVsCisKKygyMCkgRVMgdHlwZT1bMl0gRVMgcGlkPVsyMDFdICBFUyBsZW5ndGggPVswICgweDApXQorKDI1KSBFUyB0eXBlPVs0XSBFUyBwaWQ9WzMwMV0gIEVTIGxlbmd0aCA9WzAgKDB4MCldCitjYV9tZXNzYWdlIGxlbmd0aCBpcyAyNSAoMHgxOSkgYnl0ZXMKK0VONTAyMjEgQ0EgTVNHPVsgOWYgODAgMzIgMTkgMDMgMDEgMmQgZDEgZjAgMDggMDEgMDkgMDYgMDYgMDQgMDUgNTAgZmYgZjEgMDIgZTAgYzkgMDAgMDAgMDQgZTEgMmQgMDAgMDBdCisKKworTm90IGFsbCBpb2N0bCdzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgZHJpdmVyIGZyb20gdGhlIEFQSSwgdGhlIG90aGVyCitmZWF0dXJlcyBvZiB0aGUgaGFyZHdhcmUgdGhhdCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIEFQSSBhcmUgYWNoaWV2ZWQKK3VzaW5nIHRoZSBDQV9HRVRfTVNHIGFuZCBDQV9TRU5EX01TRyBpb2N0bHMuIEFuIEVONTAyMjEgc3R5bGUgd3JhcHBlciBpcwordXNlZCB0byBleGNoYW5nZSB0aGUgZGF0YSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaGFyZHdhcmUuCisKKworLyogYSBtZXNzYWdlIHRvL2Zyb20gYSBDSS1DQU0gKi8KK3R5cGVkZWYgc3RydWN0IGNhX21zZyB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciBtc2dbMjU2XTsKK30gY2FfbXNnX3Q7CisKKworVGhlIGZsb3cgb2YgZGF0YSBjYW4gYmUgZGVzY3JpYmVkIHRodXMsCisKKworCisKKworCUFwcCAoVXNlcikKKwktLS0tLQorCXBhcnNlCisJICB8CisJICB8CisJICB2CisJZW41MDIyMSBBUERVIChwYWNrYWdlKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwJICB8CQkJCXwgSGlnaCBMZXZlbCBDSSBkcml2ZXIKKyAgIHwJICB8CQkJCXwKKyAgIHwJICB2CQkJCXwKKyAgIHwJZW41MDIyMSBBUERVICh1bnBhY2thZ2UpCXwKKyAgIHwJICB8CQkJCXwKKyAgIHwJICB8CQkJCXwKKyAgIHwJICB2CQkJCXwKKyAgIHwJc2FuaXR5IGNoZWNrcwkJCXwKKyAgIHwJICB8CQkJCXwKKyAgIHwJICB8CQkJCXwKKyAgIHwJICB2CQkJCXwKKyAgIHwJZG8gKEgvVyBkZXApCQkJfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgIHwgICAgSGFyZHdhcmUKKwkgIHwKKwkgIHYKKworCisKKworVGhlIEhpZ2ggTGV2ZWwgQ0kgaW50ZXJmYWNlIHVzZXMgdGhlIEVONTAyMjEgRFZCIHN0YW5kYXJkLCBmb2xsb3dpbmcgYQorc3RhbmRhcmQgZW5zdXJlcyBmdXR1cmVwcm9vZm5lc3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIGIvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQppbmRleCAzZmZkY2IzLi5hNzUwZjAxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3ViIHRkYTEwMDQ2IHsKICAgICBteSAkc291cmNlZmlsZSA9ICJ0dF9idWRnZXRfMjE3Zy56aXAiOwogICAgIG15ICR1cmwgPSAiaHR0cDovL3d3dy50ZWNobm90cmVuZC5kZS9uZXcvMjE3Zy8kc291cmNlZmlsZSI7Ci0gICAgbXkgJGhhc2ggPSAiYTI1YjU3OWUzNzEwOWFmNjBmNGEzNmMzNzg5Mzk1N2MiOworICAgIG15ICRoYXNoID0gIjZhN2UxZTJmMjY0NGIxNjJmZjA1MDIzNjc1NTNjNzJkIjsKICAgICBteSAkb3V0ZmlsZSA9ICJkdmItZmUtdGRhMTAwNDYuZnciOwogICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyKERJUiA9PiAiL3RtcCIsIENMRUFOVVAgPT4gMSk7CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgICAgd2dldGZpbGUoJHNvdXJjZWZpbGUsICR1cmwpOwogICAgIHVuemlwKCRzb3VyY2VmaWxlLCAkdG1wZGlyKTsKLSAgICBleHRyYWN0KCIkdG1wZGlyL3NvZnR3YXJlL09FTS9QQ0kvQXBwL3R0bGNkYWNjLmRsbCIsIDB4M2Y3MzEsIDI0NDc5LCAiJHRtcGRpci9md3RtcCIpOworICAgIGV4dHJhY3QoIiR0bXBkaXIvc29mdHdhcmUvT0VNL1BDSS9BcHAvdHRsY2RhY2MuZGxsIiwgMHgzZjczMSwgMjQ0NzgsICIkdG1wZGlyL2Z3dG1wIik7CiAgICAgdmVyaWZ5KCIkdG1wZGlyL2Z3dG1wIiwgJGhhc2gpOwogICAgIGNvcHkoIiR0bXBkaXIvZnd0bXAiLCAkb3V0ZmlsZSk7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBkM2M1MmRkLi5iOWViMjA5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC02MywzICs2MywyMyBAQAogCXBlb3BsZSwgd2hvIG1pZ2h0IGJlIHVzaW5nIGltcGxlbWVudGF0aW9ucyB0aGF0IEkgYW0gbm90IGF3YXJlCiAJb2YsIHRvIGFkanVzdCB0byB0aGlzIHVwY29taW5nIGNoYW5nZS4KIFdobzoJUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJSUVFRTEzOTQgQXVkaW8gYW5kIE11c2ljIERhdGEgVHJhbnNtaXNzaW9uIFByb3RvY29sIGRyaXZlciwKKwlDb25uZWN0aW9uIE1hbmFnZW1lbnQgUHJvY2VkdXJlcyBkcml2ZXIKK1doZW46CU5vdmVtYmVyIDIwMDUKK0ZpbGVzOglkcml2ZXJzL2llZWUxMzk0L3thbWR0cCxjbXB9KgorV2h5OglUaGVzZSBhcmUgaW5jb21wbGV0ZSwgaGF2ZSBuZXZlciB3b3JrZWQsIGFuZCBhcmUgYmV0dGVyIGltcGxlbWVudGVkCisJaW4gdXNlcmxhbmQgdmlhIHJhdzEzOTQgKHNlZSBodHRwOi8vZnJlZWJvYi5zb3VyY2Vmb3JnZS5uZXQvIGZvcgorCWV4YW1wbGUuKQorV2hvOglKb2R5IE1jSW50eXJlIDxzY2pvZHlAc3RlYW1iYWxsb29uLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CXJhdzEzOTQ6IHJlcXVlc3RzIG9mIHR5cGUgUkFXMTM5NF9SRVFfSVNPX1NFTkQsIFJBVzEzOTRfUkVRX0lTT19MSVNURU4KK1doZW46CU5vdmVtYmVyIDIwMDUKK1doeToJRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIG5ldyBpb2N0bC1iYXNlZCByYXdpc28gaW50ZXJmYWNlLCB3aGljaCBpcworCW1vcmUgZWZmaWNpZW50LiAgWW91IHNob3VsZCByZWFsbHkgYmUgdXNpbmcgbGlicmF3MTM5NCBmb3IgcmF3MTM5NAorCWFjY2VzcyBhbnl3YXkuCitXaG86CUpvZHkgTWNJbnR5cmUgPHNjam9keUBzdGVhbWJhbGxvb24uY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy1wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy1wY2kudHh0CmluZGV4IGU5N2QwMjQuLjk4OGE2MmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMtcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLXBjaS50eHQKQEAgLTcsNyArNyw2IEBACiAgICAgIHwtLSAwMDAwOjE3OjAwLjAKICAgICAgfCAgIHwtLSBjbGFzcwogICAgICB8ICAgfC0tIGNvbmZpZwotICAgICB8ICAgfC0tIGRldGFjaF9zdGF0ZQogICAgICB8ICAgfC0tIGRldmljZQogICAgICB8ICAgfC0tIGlycQogICAgICB8ICAgfC0tIGxvY2FsX2NwdXMKQEAgLTE5LDcgKzE4LDcgQEAKICAgICAgfCAgIHwtLSBzdWJzeXN0ZW1fZGV2aWNlCiAgICAgIHwgICB8LS0gc3Vic3lzdGVtX3ZlbmRvcgogICAgICB8ICAgYC0tIHZlbmRvcgotICAgICBgLS0gZGV0YWNoX3N0YXRlCisgICAgIGAtLSAuLi4KIAogVGhlIHRvcG1vc3QgZWxlbWVudCBkZXNjcmliZXMgdGhlIFBDSSBkb21haW4gYW5kIGJ1cyBudW1iZXIuICBJbiB0aGlzIGNhc2UsCiB0aGUgZG9tYWluIG51bWJlciBpcyAwMDAwIGFuZCB0aGUgYnVzIG51bWJlciBpcyAxNyAoYm90aCB2YWx1ZXMgYXJlIGluIGhleCkuCkBAIC0zMSw3ICszMCw2IEBACiAgICAgICAgLS0tLQkJICAgLS0tLS0tLS0KICAgICAgICBjbGFzcwkJICAgUENJIGNsYXNzIChhc2NpaSwgcm8pCiAgICAgICAgY29uZmlnCQkgICBQQ0kgY29uZmlnIHNwYWNlIChiaW5hcnksIHJ3KQotICAgICAgIGRldGFjaF9zdGF0ZQkgICBjb25uZWN0aW9uIHN0YXR1cyAoYm9vbCwgcncpCiAgICAgICAgZGV2aWNlCQkgICBQQ0kgZGV2aWNlIChhc2NpaSwgcm8pCiAgICAgICAgaXJxCQkgICBJUlEgbnVtYmVyIChhc2NpaSwgcm8pCiAgICAgICAgbG9jYWxfY3B1cwkgICBuZWFyYnkgQ1BVIG1hc2sgKGNwdW1hc2ssIHJvKQpAQCAtODUsNCArODMsNCBAQAogCiBMZWdhY3kgcmVzb3VyY2VzIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIEhBVkVfUENJX0xFR0FDWSBkZWZpbmUuICBQbGF0Zm9ybXMKIHdpc2hpbmcgdG8gc3VwcG9ydCBsZWdhY3kgZnVuY3Rpb25hbGl0eSBzaG91bGQgZGVmaW5lIGl0IGFuZCBwcm92aWRlCi1wY2lfbGVnYWN5X3JlYWQsIHBjaV9sZWdhY3lfd3JpdGUgYW5kIHBjaV9tbWFwX2xlZ2FjeV9wYWdlX3JhbmdlIGZ1bmN0aW9ucy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitwY2lfbGVnYWN5X3JlYWQsIHBjaV9sZWdhY3lfd3JpdGUgYW5kIHBjaV9tbWFwX2xlZ2FjeV9wYWdlX3JhbmdlIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CmluZGV4IDVkNGFlOWEuLmY5ODdhZmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dApAQCAtMjA3LDI3ICsyMDcsNiBAQAogI1JFQURZX0FGVEVSX1JFU1VNRQogIwogCi1Ecml2ZXIgRGV0YWNoIFBvd2VyIE1hbmFnZW1lbnQKLQotVGhlIGtlcm5lbCBub3cgc3VwcG9ydHMgdGhlIGFiaWxpdHkgdG8gcGxhY2UgYSBkZXZpY2UgaW4gYSBsb3ctcG93ZXIKLXN0YXRlIHdoZW4gaXQgaXMgZGV0YWNoZWQgZnJvbSBpdHMgZHJpdmVyLCB3aGljaCBoYXBwZW5zIHdoZW4gaXRzCi1tb2R1bGUgaXMgcmVtb3ZlZC4gCi0KLUVhY2ggZGV2aWNlIGNvbnRhaW5zIGEgJ2RldGFjaF9zdGF0ZScgZmlsZSBpbiBpdHMgc3lzZnMgZGlyZWN0b3J5Ci13aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoaXMgc3RhdGUuIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUKLWRpc3BsYXlzIHdoYXQgdGhlIGN1cnJlbnQgZGV0YWNoIHN0YXRlIGlzIHNldCB0by4gVGhpcyBpcyAwIChPbikgYnkKLWRlZmF1bHQuIEEgdXNlciBtYXkgd3JpdGUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIHRvIHRoaXMgZmlsZSBpbiB0aGUKLXJhbmdlIG9mIDEtNCBpbmNsdXNpdmUuIAotCi1BIHZhbHVlIG9mIDEtMyB3aWxsIGluZGljYXRlIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGF0Ci1sb3ctcG93ZXIgc3RhdGUsIHdoaWNoIHdpbGwgY2F1c2UgLT5zdXNwZW5kKCkgdG8gYmUgY2FsbGVkIGZvciB0aGF0Ci1kZXZpY2UuIEEgdmFsdWUgb2YgNCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIHNob3VsZCBiZSBzaHV0ZG93biwgc28KLS0+c2h1dGRvd24oKSB3aWxsIGJlIGNhbGxlZCBmb3IgdGhhdCBkZXZpY2UuIAotCi1UaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWluaXRpYWxpemluZyB0aGUgZGV2aWNlIHdoZW4gdGhlCi1tb2R1bGUgaXMgcmUtaW5zZXJ0ZWQgZHVyaW5nIGl0J3MgLT5wcm9iZSgpIChvciBlcXVpdmFsZW50KSBtZXRob2QuIAotVGhlIGRyaXZlciBjb3JlIHdpbGwgbm90IGNhbGwgYW55IGV4dHJhIGZ1bmN0aW9ucyB3aGVuIGJpbmRpbmcgdGhlCi1kZXZpY2UgdG8gdGhlIGRyaXZlci4gCiAKIHBtX21lc3NhZ2VfdCBtZWFuaW5nCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9odmNzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9odmNzLnR4dAppbmRleCBjMGE2MmUxLi5kY2E3NWNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvaHZjcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2h2Y3MudHh0CkBAIC0zNDcsOCArMzQ3LDggQEAKIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKIAogCVBvdzU6L3N5cy9idXMvdmlvL2RyaXZlcnMvaHZjcy8zMDAwMDAwNCAjIGxzCi0JLiAgIGN1cnJlbnRfdnR5ICAgZGV2c3BlYyAgbmFtZSAgICAgICAgICBwYXJ0bmVyX3Z0eXMKLQkuLiAgZGV0YWNoX3N0YXRlICBpbmRleCAgICBwYXJ0bmVyX2NsY3MgIHZ0ZXJtX3N0YXRlCisJLiAgIGN1cnJlbnRfdnR5ICAgZGV2c3BlYyAgICAgICBuYW1lICAgICAgICAgIHBhcnRuZXJfdnR5cworCS4uICBpbmRleCAgICAgICAgIHBhcnRuZXJfY2xjcyAgdnRlcm1fc3RhdGUKIAogRWFjaCBlbnRyeSBpcyBwcm92aWRlZCwgYnkgZGVmYXVsdCB3aXRoIGEgIm5hbWUiIGF0dHJpYnV0ZS4gIFJlYWRpbmcgdGhlCiAibmFtZSIgYXR0cmlidXRlIHdpbGwgcmV2ZWFsIHRoZSBkZXZpY2UgdHlwZSBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAppbmRleCA0NGI2ZWVhLi5iOWU2YmUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKQEAgLTI1LDYgKzI1LDkgQEAKIAogICAgbm9hcGljdGltZXIJIERvbid0IHNldCB1cCB0aGUgQVBJQyB0aW1lcgogCisgICBub190aW1lcl9jaGVjayBEb24ndCBjaGVjayB0aGUgSU8tQVBJQyB0aW1lci4gVGhpcyBjYW4gd29yayBhcm91bmQKKwkJIHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IHRpbWVyIGluaXRpYWxpemF0aW9uIG9uIHNvbWUgYm9hcmRzLgorCiBFYXJseSBDb25zb2xlCiAKICAgIHN5bnRheDogZWFybHlwcmludGs9dmdhCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IGJkZGNiODYuLmMxMWEzMTcgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2CiBTVUJMRVZFTCA9IDEyCi1FWFRSQVZFUlNJT04gPS1yYzQKK0VYVFJBVkVSU0lPTiA9LXJjNQogTkFNRT1Xb296eSBOdW1iYXQKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTUzMCw3ICs1MzAsNyBAQAogaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChBUkNIKS9NYWtlZmlsZQogCiAjIGFyY2ggTWFrZWZpbGUgbWF5IG92ZXJyaWRlIENDIHNvIGtlZXAgdGhpcyBhZnRlciBhcmNoIE1ha2VmaWxlIGlzIGluY2x1ZGVkCi1OT1NURElOQ19GTEFHUyA6PSAtbm9zdGRpbmMgLWlzeXN0ZW0gJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCitOT1NURElOQ19GTEFHUyArPSAtbm9zdGRpbmMgLWlzeXN0ZW0gJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCiBDSEVDS0ZMQUdTICAgICArPSAkKE5PU1RESU5DX0ZMQUdTKQogCiAjIHdhcm4gYWJvdXQgQzk5IGRlY2xhcmF0aW9uIGFmdGVyIHN0YXRlbWVudApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCmluZGV4IDY0ZTQ1MGQuLjE2N2ZkODlmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC0xMTUwLDE2ICsxMTUwLDEzIEBACiAJaWYgKGdldF90djMyKCZ0bXAsIHNsZWVwKSkKIAkJZ290byBmYXVsdDsKIAotCXRpY2tzID0gdG1wLnR2X3VzZWM7Ci0JdGlja3MgPSAodGlja3MgKyAoMTAwMDAwMCAvIEhaKSAtIDEpIC8gKDEwMDAwMDAgLyBIWik7Ci0JdGlja3MgKz0gdG1wLnR2X3NlYyAqIEhaOworCXRpY2tzID0gdGltZXZhbF90b19qaWZmaWVzKCZ0bXApOwogCiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAJdGlja3MgPSBzY2hlZHVsZV90aW1lb3V0KHRpY2tzKTsKIAogCWlmIChyZW1haW4pIHsKLQkJdG1wLnR2X3NlYyA9IHRpY2tzIC8gSFo7Ci0JCXRtcC50dl91c2VjID0gdGlja3MgJSBIWjsKKwkJamlmZmllc190b190aW1ldmFsKHRpY2tzLCAmdG1wKTsKIAkJaWYgKHB1dF90djMyKHJlbWFpbiwgJnRtcCkpCiAJCQlnb3RvIGZhdWx0OwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKaW5kZXggZTIzZjUzNC4uOGQ5ODZiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKQEAgLTQ3OCw3ICs0NzgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdXBsbGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVVBMTENPTik7CiAKLQlzM2MyNDQwX2Nsa191cGxsLnJhdGUgPSBzM2MyNDEwX2dldF9wbGwodXBsbGNvbiwgY2xrX3h0YWwucmF0ZSkgKiAyOworCXMzYzI0NDBfY2xrX3VwbGwucmF0ZSA9IHMzYzI0MTBfZ2V0X3BsbCh1cGxsY29uLCBjbGtfeHRhbC5yYXRlKTsKIAogCXByaW50aygiUzNDMjQ0MDogQ2xvY2sgU3VwcG9ydCwgVVBMTCAlbGQuJTAzbGQgTUh6XG4iLAogCSAgICAgICBwcmludF9taHooczNjMjQ0MF9jbGtfdXBsbC5yYXRlKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuYwppbmRleCA5YThjYzVhLi5kNGM4MjgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLmMKQEAgLTE5Miw5ICsxOTIsMTEgQEAKIAogCWlvdGFibGVfaW5pdChzM2MyNDQwX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDQwX2lvZGVzYykpOwogCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIHNpemUpOworCiAJLyogcmVuYW1lIGFueSBwZXJpcGhlcmFscyB1c2VkIGRpZmZlcmluZyBmcm9tIHRoZSBzM2MyNDEwICovCiAKLQlzM2NfZGV2aWNlX2kyYy5uYW1lID0gInMzYzI0NDAtaTJjIjsKKwlzM2NfZGV2aWNlX2kyYy5uYW1lICA9ICJzM2MyNDQwLWkyYyI7CisJczNjX2RldmljZV9uYW5kLm5hbWUgPSAiczNjMjQ0MC1uYW5kIjsKIAogCS8qIGNoYW5nZSBpcnEgZm9yIHdhdGNoZG9nICovCiAKQEAgLTIyNSw3ICsyMjcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUzNDMjQ0MF9DTEtESVZOX0hESVZOXzI6Ci0JCWhkaXYgPSAxOworCQloZGl2ID0gMjsKIAkJYnJlYWs7CiAKIAljYXNlIFMzQzI0NDBfQ0xLRElWTl9IRElWTl80Xzg6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBjNGZjNmJlLi40OGJhYzdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTQxMiwyMSArNDEyLDIwIEBACiAKIGNvbmZpZyBUTFNfUkVHX0VNVUwKIAlib29sCi0JZGVmYXVsdCB5IGlmIChTTVAgfHwgQ1BVXzMydjYpICYmIChDUFVfMzJ2NSB8fCBDUFVfMzJ2NCB8fCBDUFVfMzJ2MykKKwlkZWZhdWx0IHkgaWYgU01QICYmIChDUFVfMzJ2NSB8fCBDUFVfMzJ2NCB8fCBDUFVfMzJ2MykKIAloZWxwCi0JICBXZSBtaWdodCBiZSBydW5uaW5nIG9uIGFuIEFSTXY2KyBwcm9jZXNzb3Igd2hpY2ggc2hvdWxkIGhhdmUgdGhlIFRMUwotCSAgcmVnaXN0ZXIgYnV0IGZvciBzb21lIHJlYXNvbiB3ZSBjYW4ndCB1c2UgaXQsIG9yIG1heWJlIGFuIFNNUCBzeXN0ZW0KLQkgIHVzaW5nIGEgcHJlLUFSTXY2IHByb2Nlc3NvciAodGhlcmUgYXJlIGFwcGFyZW50bHkgYSBmZXcgcHJvdG90eXBlcwotCSAgbGlrZSB0aGF0IGluIGV4aXN0ZW5jZSkgYW5kIHRoZXJlZm9yZSBhY2Nlc3MgdG8gdGhhdCByZWdpc3RlciBtdXN0Ci0JICBiZSBlbXVsYXRlZC4KKwkgIEFuIFNNUCBzeXN0ZW0gdXNpbmcgYSBwcmUtQVJNdjYgcHJvY2Vzc29yICh0aGVyZSBhcmUgYXBwYXJlbnRseQorCSAgYSBmZXcgcHJvdG90eXBlcyBsaWtlIHRoYXQgaW4gZXhpc3RlbmNlKSBhbmQgdGhlcmVmb3JlIGFjY2VzcyB0bworCSAgdGhhdCByZXF1aXJlZCByZWdpc3RlciBtdXN0IGJlIGVtdWxhdGVkLgogCiBjb25maWcgSEFTX1RMU19SRUcKIAlib29sCi0JZGVwZW5kcyBvbiBDUFVfMzJ2NgotCWRlZmF1bHQgeSBpZiAhVExTX1JFR19FTVVMCisJZGVwZW5kcyBvbiAhVExTX1JFR19FTVVMCisJZGVmYXVsdCB5IGlmIFNNUCB8fCBDUFVfMzJ2NwogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciB0aGUgQ1AxNSB0aHJlYWQgcmVnaXN0ZXIuCi0JICBJdCBpcyBkZWZpbmVkIHRvIGJlIGF2YWlsYWJsZSBvbiBBUk12NiBvciBsYXRlci4gIElmIGEgcGFydGljdWxhcgotCSAgQVJNdjYgb3IgbGF0ZXIgQ1BVIGRvZXNuJ3Qgc3VwcG9ydCBpdCB0aGVuIGl0IG11c3Qgb21jO2lkZSAic2VsZWN0Ci0JICBUTFNfUkVHX0VNVUwiIGFsb25nIHdpdGggaXRzIG90aGVyIGNhcmFjdGVyaXN0aWNzLgorCSAgSXQgaXMgZGVmaW5lZCB0byBiZSBhdmFpbGFibGUgb24gc29tZSBBUk12NiBwcm9jZXNzb3JzIChpbmNsdWRpbmcKKwkgIGFsbCBTTVAgY2FwYWJsZSBBUk12NidzKSBvciBsYXRlciBwcm9jZXNzb3JzLiAgVXNlciBzcGFjZSBtYXkKKwkgIGFzc3VtZSBkaXJlY3RseSBhY2Nlc3NpbmcgdGhhdCByZWdpc3RlciBhbmQgYWx3YXlzIG9idGFpbiB0aGUKKwkgIGV4cGVjdGVkIHZhbHVlIG9ubHkgb24gQVJNdjcgYW5kIGFib3ZlLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWFmM2QuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjRtYy5TCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9saWIvY29weV9wYWdlLWFybXY0bWMuUwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMSBSdXNzZWxsIEtpbmcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBBU00gb3B0aW1pc2VkIHN0cmluZyBmdW5jdGlvbnMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgotCi0JLnRleHQKLQkuYWxpZ24JNQotLyoKLSAqIEFSTXY0IG1pbmktZGNhY2hlIG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQotICoKLSAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQotICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCi0gKiBEY2FjaGUgYWxpYXNpbmcgaXNzdWUuICBUaGUgd3JpdGVzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB3cml0ZSBidWZmZXIsCi0gKiBhbmQgbWVyZ2VkIGFzIGFwcHJvcHJpYXRlLgotICoKLSAqIE5vdGU6IFdlIHJlbHkgb24gYWxsIEFSTXY0IHByb2Nlc3NvcnMgaW1wbGVtZW50aW5nIHRoZSAiaW52YWxpZGF0ZSBEIGxpbmUiCi0gKiBpbnN0cnVjdGlvbi4gIElmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBseSB0aGlzLCB5b3UgaGF2ZSB0byB3cml0ZSB5b3VyCi0gKiBvd24gY29weV91c2VyX3BhZ2UgdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZy4KLSAqLwotRU5UUlkodjRfbWNfY29weV91c2VyX3BhZ2UpCi0Jc3RtZmQJc3AhLCB7cjQsIGxyfQkJCUAgMgotCW1vdglyNCwgcjAKLQltb3YJcjAsIHIxCi0JYmwJbWFwX3BhZ2VfbWluaWNhY2hlCi0JbW92CXIxLCAjUEFHRV9TWi82NAkJCUAgMQotCWxkbWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0xOgltY3IJcDE1LCAwLCByNCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQotCXN0bWlhCXI0ISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQrMQotCXN0bWlhCXI0ISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQltY3IJcDE1LCAwLCByNCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQotCXN0bWlhCXI0ISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQlzdWJzCXIxLCByMSwgIzEJCQlAIDEKLQlzdG1pYQlyNCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCWxkbW5laWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQlibmUJMWIJCQkJQCAxCi0JbGRtZmQJc3AhLCB7cjQsIHBjfQkJCUAgMwotCi0JLmFsaWduCTUKLS8qCi0gKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCi0gKgotICogU2FtZSBzdG9yeSBhcyBhYm92ZS4KLSAqLwotRU5UUlkodjRfbWNfY2xlYXJfdXNlcl9wYWdlKQotCXN0cglsciwgW3NwLCAjLTRdIQotCW1vdglyMSwgI1BBR0VfU1ovNjQJCQlAIDEKLQltb3YJcjIsICMwCQkJCUAgMQotCW1vdglyMywgIzAJCQkJQCAxCi0JbW92CWlwLCAjMAkJCQlAIDEKLQltb3YJbHIsICMwCQkJCUAgMQotMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0JbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0Jc3VicwlyMSwgcjEsICMxCQkJQCAxCi0JYm5lCTFiCQkJCUAgMQotCWxkcglwYywgW3NwXSwgIzQKLQotCV9fSU5JVERBVEEKLQotCS50eXBlCXY0X21jX3VzZXJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2NF9tY191c2VyX2ZucykKLQkubG9uZwl2NF9tY19jbGVhcl91c2VyX3BhZ2UKLQkubG9uZwl2NF9tY19jb3B5X3VzZXJfcGFnZQotCS5zaXplCXY0X21jX3VzZXJfZm5zLCAuIC0gdjRfbWNfdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY5ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjRtYy5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2xpYi9jb3B5cGFnZS1hcm12NG1jLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGhhbmRsZXMgdGhlIG1pbmkgZGF0YSBjYWNoZSwgYXMgZm91bmQgb24gU0ExMXgwIGFuZCBYU2NhbGUKKyAqIHByb2Nlc3NvcnMuICBXaGVuIHdlIGNvcHkgYSB1c2VyIHBhZ2UgcGFnZSwgd2UgbWFwIGl0IGluIHN1Y2ggYSB3YXkKKyAqIHRoYXQgYWNjZXNzZXMgdG8gdGhpcyBwYWdlIHdpbGwgbm90IHRvdWNoIHRoZSBtYWluIGRhdGEgY2FjaGUsIGJ1dAorICogd2lsbCBiZSBjYWNoZWQgaW4gdGhlIG1pbmkgZGF0YSBjYWNoZS4gIFRoaXMgcHJldmVudHMgdXMgdGhyYXNoaW5nCisgKiB0aGUgbWFpbiBkYXRhIGNhY2hlIG9uIHBhZ2UgZmF1bHRzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKy8qCisgKiAweGZmZmY4MDAwIHRvIDB4ZmZmZmZmZmYgaXMgcmVzZXJ2ZWQgZm9yIGFueSBBUk0gYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBoYWNrcyBmb3IgY29weWluZyBwYWdlcyBlZmZpY2llbnRseS4KKyAqLworI2RlZmluZSBtaW5pY2FjaGVfcGdwcm90IF9fcGdwcm90KExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IFwKKwkJCQkgIExfUFRFX0NBQ0hFQUJMRSkKKworI2RlZmluZSBUT1BfUFRFKHgpCXB0ZV9vZmZzZXRfa2VybmVsKHRvcF9wbWQsIHgpCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWluaWNhY2hlX2xvY2spOworCisvKgorICogQVJNdjQgbWluaS1kY2FjaGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCisgKgorICogV2UgZmx1c2ggdGhlIGRlc3RpbmF0aW9uIGNhY2hlIGxpbmVzIGp1c3QgYmVmb3JlIHdlIHdyaXRlIHRoZSBkYXRhIGludG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICBTaW5jZSB0aGUgRGNhY2hlIGlzIHJlYWQtYWxsb2NhdGUsIHRoaXMgcmVtb3ZlcyB0aGUKKyAqIERjYWNoZSBhbGlhc2luZyBpc3N1ZS4gIFRoZSB3cml0ZXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHdyaXRlIGJ1ZmZlciwKKyAqIGFuZCBtZXJnZWQgYXMgYXBwcm9wcmlhdGUuCisgKgorICogTm90ZTogV2UgcmVseSBvbiBhbGwgQVJNdjQgcHJvY2Vzc29ycyBpbXBsZW1lbnRpbmcgdGhlICJpbnZhbGlkYXRlIEQgbGluZSIKKyAqIGluc3RydWN0aW9uLiAgSWYgeW91ciBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcGx5IHRoaXMsIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIKKyAqIG93biBjb3B5X3VzZXJfcGFnZSB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorICovCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCittY19jb3B5X3VzZXJfcGFnZSh2b2lkICpmcm9tLCB2b2lkICp0bykKK3sKKwlhc20gdm9sYXRpbGUoCisJInN0bWZkCXNwISwge3I0LCBscn0JCQlAIDJcblwKKwltb3YJcjQsICUyCQkJCUAgMVxuXAorCWxkbWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisxOgltY3IJcDE1LCAwLCAlMSwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZVxuXAorCXN0bWlhCSUxISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJbGRtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQrMVxuXAorCXN0bWlhCSUxISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJbGRtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwltY3IJcDE1LCAwLCAlMSwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZVxuXAorCXN0bWlhCSUxISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJbGRtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdWJzCXI0LCByNCwgIzEJCQlAIDFcblwKKwlzdG1pYQklMSEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCWxkbW5laWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlibmUJMWIJCQkJQCAxXG5cCisJbGRtZmQJc3AhLCB7cjQsIHBjfQkJCUAgMyIKKwk6CisJOiAiciIgKGZyb20pLCAiciIgKHRvKSwgIkkiIChQQUdFX1NJWkUgLyA2NCkpOworfQorCit2b2lkIHY0X21jX2NvcHlfdXNlcl9wYWdlKHZvaWQgKmt0bywgY29uc3Qgdm9pZCAqa2Zyb20sIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJc3Bpbl9sb2NrKCZtaW5pY2FjaGVfbG9jayk7CisKKwlzZXRfcHRlKFRPUF9QVEUoMHhmZmZmODAwMCksIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgbWluaWNhY2hlX3BncHJvdCkpOworCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSgweGZmZmY4MDAwKTsKKworCW1jX2NvcHlfdXNlcl9wYWdlKCh2b2lkICopMHhmZmZmODAwMCwga3RvKTsKKworCXNwaW5fdW5sb2NrKCZtaW5pY2FjaGVfbG9jayk7Cit9CisKKy8qCisgKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKi8KK3ZvaWQgX19hdHRyaWJ1dGVfXygobmFrZWQpKQordjRfbWNfY2xlYXJfdXNlcl9wYWdlKHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCWFzbSB2b2xhdGlsZSgKKwkic3RyCWxyLCBbc3AsICMtNF0hXG5cCisJbW92CXIxLCAlMAkJCQlAIDFcblwKKwltb3YJcjIsICMwCQkJCUAgMVxuXAorCW1vdglyMywgIzAJCQkJQCAxXG5cCisJbW92CWlwLCAjMAkJCQlAIDFcblwKKwltb3YJbHIsICMwCQkJCUAgMVxuXAorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJc3VicwlyMSwgcjEsICMxCQkJQCAxXG5cCisJYm5lCTFiCQkJCUAgMVxuXAorCWxkcglwYywgW3NwXSwgIzQiCisJOgorCTogIkkiIChQQUdFX1NJWkUgLyA2NCkpOworfQorCitzdHJ1Y3QgY3B1X3VzZXJfZm5zIHY0X21jX3VzZXJfZm5zIF9faW5pdGRhdGEgPSB7CisJLmNwdV9jbGVhcl91c2VyX3BhZ2UJPSB2NF9tY19jbGVhcl91c2VyX3BhZ2UsIAorCS5jcHVfY29weV91c2VyX3BhZ2UJPSB2NF9tY19jb3B5X3VzZXJfcGFnZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYwppbmRleCA2OTRhYzgyLi5hOGMwMDIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKQEAgLTI2LDggKzI2LDggQEAKICNkZWZpbmUgdG9fYWRkcmVzcwkoMHhmZmZmYzAwMCkKICNkZWZpbmUgdG9fcGdwcm90CVBBR0VfS0VSTkVMCiAKLXN0YXRpYyBwdGVfdCAqZnJvbV9wdGU7Ci1zdGF0aWMgcHRlX3QgKnRvX3B0ZTsKKyNkZWZpbmUgVE9QX1BURSh4KQlwdGVfb2Zmc2V0X2tlcm5lbCh0b3BfcG1kLCB4KQorCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHY2X2xvY2spOwogCiAjZGVmaW5lIERDQUNIRV9DT0xPVVIodmFkZHIpICgodmFkZHIgJiAoU0hNTEJBIC0gMSkpID4+IFBBR0VfU0hJRlQpCkBAIC03NCw4ICs3NCw4IEBACiAJICovCiAJc3Bpbl9sb2NrKCZ2Nl9sb2NrKTsKIAotCXNldF9wdGUoZnJvbV9wdGUgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgZnJvbV9wZ3Byb3QpKTsKLQlzZXRfcHRlKHRvX3B0ZSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGt0bykgPj4gUEFHRV9TSElGVCwgdG9fcGdwcm90KSk7CisJc2V0X3B0ZShUT1BfUFRFKGZyb21fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgZnJvbV9wZ3Byb3QpKTsKKwlzZXRfcHRlKFRPUF9QVEUodG9fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrdG8pID4+IFBBR0VfU0hJRlQsIHRvX3BncHJvdCkpOwogCiAJZnJvbSA9IGZyb21fYWRkcmVzcyArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7CiAJdG8gICA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAJICovCiAJc3Bpbl9sb2NrKCZ2Nl9sb2NrKTsKIAotCXNldF9wdGUodG9fcHRlICsgb2Zmc2V0LCBwZm5fcHRlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQsIHRvX3BncHJvdCkpOworCXNldF9wdGUoVE9QX1BURSh0b19hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZULCB0b19wZ3Byb3QpKTsKIAlmbHVzaF90bGJfa2VybmVsX3BhZ2UodG8pOwogCWNsZWFyX3BhZ2UoKHZvaWQgKil0byk7CiAKQEAgLTEyOSwyMSArMTI5LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IHY2X3VzZXJwYWdlX2luaXQodm9pZCkKIHsKIAlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7Ci0JCXBnZF90ICpwZ2Q7Ci0JCXBtZF90ICpwbWQ7Ci0KLQkJcGdkID0gcGdkX29mZnNldF9rKGZyb21fYWRkcmVzcyk7Ci0JCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBmcm9tX2FkZHJlc3MpOwotCQlpZiAoIXBtZCkKLQkJCUJVRygpOwotCQlmcm9tX3B0ZSA9IHB0ZV9hbGxvY19rZXJuZWwoJmluaXRfbW0sIHBtZCwgZnJvbV9hZGRyZXNzKTsKLQkJaWYgKCFmcm9tX3B0ZSkKLQkJCUJVRygpOwotCi0JCXRvX3B0ZSA9IHB0ZV9hbGxvY19rZXJuZWwoJmluaXRfbW0sIHBtZCwgdG9fYWRkcmVzcyk7Ci0JCWlmICghdG9fcHRlKQotCQkJQlVHKCk7Ci0KIAkJY3B1X3VzZXIuY3B1X2NsZWFyX3VzZXJfcGFnZSA9IHY2X2NsZWFyX3VzZXJfcGFnZV9hbGlhc2luZzsKIAkJY3B1X3VzZXIuY3B1X2NvcHlfdXNlcl9wYWdlID0gdjZfY29weV91c2VyX3BhZ2VfYWxpYXNpbmc7CiAJfQpAQCAtMTUxLDUgKzEzNiw0IEBACiAJcmV0dXJuIDA7CiB9CiAKLV9faW5pdGNhbGwodjZfdXNlcnBhZ2VfaW5pdCk7Ci0KK2NvcmVfaW5pdGNhbGwodjZfdXNlcnBhZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mbHVzaC5jIGIvYXJjaC9hcm0vbW0vZmx1c2guYwppbmRleCBjNmRlNDhkLi40MDg1ZWQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mbHVzaC5jCisrKyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKQEAgLTEzLDYgKzEzLDI5IEBACiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworI2lmZGVmIENPTkZJR19DUFVfQ0FDSEVfVklQVAorI2RlZmluZSBBTElBU19GTFVTSF9TVEFSVAkweGZmZmY0MDAwCisKKyNkZWZpbmUgVE9QX1BURSh4KQlwdGVfb2Zmc2V0X2tlcm5lbCh0b3BfcG1kLCB4KQorCitzdGF0aWMgdm9pZCBmbHVzaF9wZm5fYWxpYXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB0byA9IEFMSUFTX0ZMVVNIX1NUQVJUICsgKENBQ0hFX0NPTE9VUih2YWRkcikgPDwgUEFHRV9TSElGVCk7CisKKwlzZXRfcHRlKFRPUF9QVEUodG8pLCBwZm5fcHRlKHBmbiwgUEFHRV9LRVJORUwpKTsKKwlmbHVzaF90bGJfa2VybmVsX3BhZ2UodG8pOworCisJYXNtKAkibWNycglwMTUsIDAsICUxLCAlMCwgYzE0XG4iCisJIgltY3JyCXAxNSwgMCwgJTEsICUwLCBjNVxuIgorCSAgICA6CisJICAgIDogInIiICh0byksICJyIiAodG8gKyBQQUdFX1NJWkUgLSBMMV9DQUNIRV9CWVRFUykKKwkgICAgOiAiY2MiKTsKK30KKyNlbHNlCisjZGVmaW5lIGZsdXNoX3Bmbl9hbGlhcyhwZm4sdmFkZHIpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2ZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKQEAgLTM3LDYgKzYwLDE4IEBACiAJCXJldHVybjsKIAogCS8qCisJICogVGhpcyBpcyBhIHBhZ2UgY2FjaGUgcGFnZS4gIElmIHdlIGhhdmUgYSBWSVBUIGNhY2hlLCB3ZQorCSAqIG9ubHkgbmVlZCB0byBkbyBvbmUgZmx1c2ggLSB3aGljaCB3b3VsZCBiZSBhdCB0aGUgcmVsZXZhbnQKKwkgKiB1c2Vyc3BhY2UgY29sb3VyLCB3aGljaCBpcyBjb25ncnVlbnQgd2l0aCBwYWdlLT5pbmRleC4KKwkgKi8KKwlpZiAoY2FjaGVfaXNfdmlwdCgpKSB7CisJCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpCisJCQlmbHVzaF9wZm5fYWxpYXMocGFnZV90b19wZm4ocGFnZSksCisJCQkJCXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlyZXR1cm47CisJfQorCisJLyoKIAkgKiBUaGVyZSBhcmUgcG9zc2libGUgdXNlciBzcGFjZSBtYXBwaW5ncyBvZiB0aGlzIHBhZ2U6CiAJICogLSBWSVZUIGNhY2hlOiB3ZSBuZWVkIHRvIGFsc28gd3JpdGUgYmFjayBhbmQgaW52YWxpZGF0ZSBhbGwgdXNlcgogCSAqICAgZGF0YSBpbiB0aGUgY3VycmVudCBWTSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCkBAIC01Nyw4ICs5Miw2IEBACiAJCQljb250aW51ZTsKIAkJb2Zmc2V0ID0gKHBnb2ZmIC0gbXBudC0+dm1fcGdvZmYpIDw8IFBBR0VfU0hJRlQ7CiAJCWZsdXNoX2NhY2hlX3BhZ2UobXBudCwgbXBudC0+dm1fc3RhcnQgKyBvZmZzZXQsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKLQkJaWYgKGNhY2hlX2lzX3ZpcHQoKSkKLQkJCWJyZWFrOwogCX0KIAlmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbS1hcm12LmMgYi9hcmNoL2FybS9tbS9tbS1hcm12LmMKaW5kZXggNTg1ZGZiOC4uMmMyYjkzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCisrKyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwpAQCAtMzcsNiArMzcsOCBAQAogCiBFWFBPUlRfU1lNQk9MKHBncHJvdF9rZXJuZWwpOwogCitwbWRfdCAqdG9wX3BtZDsKKwogc3RydWN0IGNhY2hlcG9saWN5IHsKIAljb25zdCBjaGFyCXBvbGljeVsxNl07CiAJdW5zaWduZWQgaW50CWNyX21hc2s7CkBAIC0xNDIsNiArMTQ0LDE2IEBACiAKICNkZWZpbmUgRklSU1RfS0VSTkVMX1BHRF9OUgkoRklSU1RfVVNFUl9QR0RfTlIgKyBVU0VSX1BUUlNfUEVSX1BHRCkKIAorc3RhdGljIGlubGluZSBwbWRfdCAqcG1kX29mZihwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIHZpcnQpCit7CisJcmV0dXJuIHBtZF9vZmZzZXQocGdkLCB2aXJ0KTsKK30KKworc3RhdGljIGlubGluZSBwbWRfdCAqcG1kX29mZl9rKHVuc2lnbmVkIGxvbmcgdmlydCkKK3sKKwlyZXR1cm4gcG1kX29mZihwZ2Rfb2Zmc2V0X2sodmlydCksIHZpcnQpOworfQorCiAvKgogICogbmVlZCB0byBnZXQgYSAxNmsgcGFnZSBmb3IgbGV2ZWwgMQogICovCkBAIC0yMjAsNyArMjMyLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogcGdkIGlzIGFsd2F5cyBwcmVzZW50IGFuZCBnb29kICovCi0JcG1kID0gKHBtZF90ICopcGdkOworCXBtZCA9IHBtZF9vZmYocGdkLCAwKTsKIAlpZiAocG1kX25vbmUoKnBtZCkpCiAJCWdvdG8gZnJlZTsKIAlpZiAocG1kX2JhZCgqcG1kKSkgewpAQCAtMjQ2LDkgKzI1OCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGFsbG9jX2luaXRfc2VjdGlvbih1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgcGh5cywgaW50IHByb3QpCiB7Ci0JcG1kX3QgKnBtZHA7CisJcG1kX3QgKnBtZHAgPSBwbWRfb2ZmX2sodmlydCk7CiAKLQlwbWRwID0gcG1kX29mZnNldChwZ2Rfb2Zmc2V0X2sodmlydCksIHZpcnQpOwogCWlmICh2aXJ0ICYgKDEgPDwgMjApKQogCQlwbWRwKys7CiAKQEAgLTI4MywxMSArMjk0LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogYWxsb2NfaW5pdF9wYWdlKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBpbnQgcHJvdF9sMSwgcGdwcm90X3QgcHJvdCkKIHsKLQlwbWRfdCAqcG1kcDsKKwlwbWRfdCAqcG1kcCA9IHBtZF9vZmZfayh2aXJ0KTsKIAlwdGVfdCAqcHRlcDsKIAotCXBtZHAgPSBwbWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2aXJ0KSwgdmlydCk7Ci0KIAlpZiAocG1kX25vbmUoKnBtZHApKSB7CiAJCXVuc2lnbmVkIGxvbmcgcG1kdmFsOwogCQlwdGVwID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoMiAqIFBUUlNfUEVSX1BURSAqCkBAIC0zMTAsNyArMzE5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0KQogewotCXBtZF9jbGVhcihwbWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2aXJ0KSwgdmlydCkpOworCXBtZF9jbGVhcihwbWRfb2ZmX2sodmlydCkpOwogfQogCiBzdHJ1Y3QgbWVtX3R5cGVzIHsKQEAgLTU3OCw3ICs1ODcsNyBAQAogCQkJIFBNRF9UWVBFX1NFQ1Q7CiAJCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NSkKIAkJCXBtZHZhbCB8PSBQTURfQklUNDsKLQkJcG1kID0gcG1kX29mZnNldChwZ2QgKyBpLCBpIDw8IFBHRElSX1NISUZUKTsKKwkJcG1kID0gcG1kX29mZihwZ2QsIGkgPDwgUEdESVJfU0hJRlQpOwogCQlwbWRbMF0gPSBfX3BtZChwbWR2YWwpOwogCQlwbWRbMV0gPSBfX3BtZChwbWR2YWwgKyAoMSA8PCAoUEdESVJfU0hJRlQgLSAxKSkpOwogCQlmbHVzaF9wbWRfZW50cnkocG1kKTsKQEAgLTY3NSw2ICs2ODQsOCBAQAogCiAJZmx1c2hfY2FjaGVfYWxsKCk7CiAJZmx1c2hfdGxiX2FsbCgpOworCisJdG9wX3BtZCA9IHBtZF9vZmZfaygweGZmZmYwMDAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggMTZkYmM0MS4uNzNhZWFmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTI0LDkgKzI0LDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKLSNpZmRlZiBDT05GSUdfWDg2X1NNUAotCWludCBjcHUgPSBjID09ICZib290X2NwdV9kYXRhID8gMCA6IGMgLSBjcHVfZGF0YTsKLSNlbmRpZgogCXUzMiBsLCBoOwogCWludCBtYnl0ZXMgPSBudW1fcGh5c3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKTsKIAlpbnQgcjsKQEAgLTE5OCwxNCArMTk1LDE5IEBACiAJCQljLT54ODZfbnVtX2NvcmVzID0gMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfWDg2X1NNUAorI2lmZGVmIENPTkZJR19YODZfSFQKIAkvKgogCSAqIE9uIGEgQU1EIGR1YWwgY29yZSBzZXR1cCB0aGUgbG93ZXIgYml0cyBvZiB0aGUgQVBJQyBpZAogCSAqIGRpc3Rpbmd1c2ggdGhlIGNvcmVzLiAgQXNzdW1lcyBudW1iZXIgb2YgY29yZXMgaXMgYSBwb3dlcgogCSAqIG9mIHR3by4KIAkgKi8KIAlpZiAoYy0+eDg2X251bV9jb3JlcyA+IDEpIHsKLQkJY3B1X2NvcmVfaWRbY3B1XSA9IGNwdSA+PiBod2VpZ2h0MzIoYy0+eDg2X251bV9jb3JlcyAtIDEpOworCQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQl1bnNpZ25lZCBiaXRzID0gMDsKKwkJd2hpbGUgKCgxIDw8IGJpdHMpIDwgYy0+eDg2X251bV9jb3JlcykKKwkJCWJpdHMrKzsKKwkJY3B1X2NvcmVfaWRbY3B1XSA9IHBoeXNfcHJvY19pZFtjcHVdICYgKCgxPDxiaXRzKS0xKTsKKwkJcGh5c19wcm9jX2lkW2NwdV0gPj49IGJpdHM7CiAJCXByaW50ayhLRVJOX0lORk8gIkNQVSAlZCglZCkgLT4gQ29yZSAlZFxuIiwKIAkJICAgICAgIGNwdSwgYy0+eDg2X251bV9jb3JlcywgY3B1X2NvcmVfaWRbY3B1XSk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA2YmUwMzEwLi5kMTk5ZTUyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMjQzLDYgKzI0MywxMCBAQAogCX0KIAogCWVhcmx5X2ludGVsX3dvcmthcm91bmQoYyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0hUCisJcGh5c19wcm9jX2lkW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSAoY3B1aWRfZWJ4KDEpID4+IDI0KSAmIDB4ZmY7CisjZW5kaWYKIH0KIAogdm9pZCBfX2luaXQgZ2VuZXJpY19pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBjYmVhN2FjLi4zNWJmZTEzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtODg4LDYgKzg4OCw3IEBACiAKIGNwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKK0VYUE9SVF9TWU1CT0woY3B1X2NvcmVfbWFwKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHNtcF9ib290X2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCmluZGV4IDkwM2Q3MzkuLmE2ZTBkZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYworKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKQEAgLTk3LDcgKzk3LDYgQEAKIHN0YXRpYyB2b2lkIHZpY19lbmFibGVfY3BpKHZvaWQpOwogc3RhdGljIHZvaWQgZG9fYm9vdF9jcHUoX191OCBjcHVpZCk7CiBzdGF0aWMgdm9pZCBkb19xdWFkX2Jvb3RzdHJhcCh2b2lkKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cmFwcGVyX3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiAKIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCk7CiAKQEAgLTEyNiw2ICsxMjUsMTQgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCit3cmFwcGVyX3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXJxX2VudGVyKCk7CisJc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChyZWdzKTsKKwlpcnFfZXhpdCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIHNlbmRfb25lX0NQSShfX3U4IGNwdSwgX191OCBjcGkpCiB7CiAJaWYodm95YWdlcl9xdWFkX3Byb2Nlc3NvcnMgJiAoMTw8Y3B1KSkKQEAgLTEyNDksMTQgKzEyNTYsNiBAQAogCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotd3JhcHBlcl9zbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlycV9lbnRlcigpOwotCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7Ci0JaXJxX2V4aXQoKTsKLX0KLQogLyogbG9jYWwgKHBlciBDUFUpIHRpbWVyIGludGVycnVwdC4gIEl0IGRvZXMgYm90aCBwcm9maWxpbmcgYW5kCiAgKiBwcm9jZXNzIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMgYi9hcmNoL2kzODYvbW0vaW9yZW1hcC5jCmluZGV4IGRiMDZmNzMuLmFiNTQyNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9pMzg2L21tL2lvcmVtYXAuYwpAQCAtMjM4LDE5ICsyMzgsMjEgQEAKIAkJCWFkZHIgPCBwaHlzX3RvX3ZpcnQoSVNBX0VORF9BRERSRVNTKSkKIAkJcmV0dXJuOwogCi0JcCA9IHJlbW92ZV92bV9hcmVhKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBhZGRyKSk7CisJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOworCXAgPSBfX3JlbW92ZV92bV9hcmVhKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBhZGRyKSk7CiAJaWYgKCFwKSB7IAotCQlwcmludGsoIl9faW91bm1hcDogYmFkIGFkZHJlc3MgJXBcbiIsIGFkZHIpOwotCQlyZXR1cm47CisJCXByaW50aygiaW91bm1hcDogYmFkIGFkZHJlc3MgJXBcbiIsIGFkZHIpOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJaWYgKChwLT5mbGFncyA+PiAyMCkgJiYgcC0+cGh5c19hZGRyIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSAtIDEpIHsKLQkJLyogcC0+c2l6ZSBpbmNsdWRlcyB0aGUgZ3VhcmQgcGFnZSwgYnV0IGNwYSBkb2Vzbid0IGxpa2UgdGhhdCAqLwogCQljaGFuZ2VfcGFnZV9hdHRyKHZpcnRfdG9fcGFnZShfX3ZhKHAtPnBoeXNfYWRkcikpLAogCQkJCSBwLT5zaXplID4+IFBBR0VfU0hJRlQsCiAJCQkJIFBBR0VfS0VSTkVMKTsKIAkJZ2xvYmFsX2ZsdXNoX3RsYigpOwogCX0gCitvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOwogCWtmcmVlKHApOyAKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jIGIvYXJjaC9pMzg2L3BjaS9maXh1cC5jCmluZGV4IGJlNTJjNWEuLjhlOGU4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogI2RlZmluZSBNQVhfUENJRVJPT1QJNgogc3RhdGljIGludCBxdWlya19hc3BtX29mZnNldFtNQVhfUENJRVJPT1QgPDwgM107CiAKLSNkZWZpbmUgR0VUX0lOREVYKGEsIGIpICgoKGEgLSBQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQSkgPDwgMykgKyBiKQorI2RlZmluZSBHRVRfSU5ERVgoYSwgYikgKCgoKGEpIC0gUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEEpIDw8IDMpICsgKChiKSAmIDcpKQogCiBzdGF0aWMgaW50IHF1aXJrX3BjaWVfYXNwbV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfaW9jdGwuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfaW9jdGwuYwppbmRleCA5ODQ1ZGFiLi4xNjRiMjExIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2lvY3RsLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9pb2N0bC5jCkBAIC0xMyw3ICsxMyw2IEBACiAgIAogI2RlZmluZQlJTkNMVURFUwogI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotI2luY2x1ZGUgPGFzbS9pb2N0bDMyLmg+CiAKICNkZWZpbmUgSU9DVExfTlIoYSkJKChhKSAmIH4oX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3BtdS5jIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcG11LmMKaW5kZXggYzVmMTA0My4uNTMxNjZmMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcG11LmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcG11LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIHBtdS5jLCBQb3dlciBNYW5hZ2VtZW50IFVuaXQgcm91dGluZXMgZm9yIE5FQyBWUjQxMDAgc2VyaWVzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTcsNyArMTcsOSBAQAogICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTI3LDIwICsyOSwzMSBAQAogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNkZWZpbmUgUE1VQ05UMlJFRwlLU0VHMUFERFIoMHgwZjAwMDBjNikKKyNkZWZpbmUgUE1VX1RZUEUxX0JBU0UJMHgwYjAwMDBhMFVMCisjZGVmaW5lIFBNVV9UWVBFMV9TSVpFCTB4MGVVTAorCisjZGVmaW5lIFBNVV9UWVBFMl9CQVNFCTB4MGYwMDAwYzBVTAorI2RlZmluZSBQTVVfVFlQRTJfU0laRQkweDEwVUwKKworI2RlZmluZSBQTVVDTlQyUkVHCTB4MDYKICAjZGVmaW5lIFNPRlRSU1QJMHgwMDEwCiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnBtdV9iYXNlOworCisjZGVmaW5lIHBtdV9yZWFkKG9mZnNldCkJCXJlYWR3KHBtdV9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIHBtdV93cml0ZShvZmZzZXQsIHZhbHVlKQl3cml0ZXcoKHZhbHVlKSwgcG11X2Jhc2UgKyAob2Zmc2V0KSkKKwogc3RhdGljIGlubGluZSB2b2lkIHNvZnR3YXJlX3Jlc2V0KHZvaWQpCiB7Ci0JdWludDE2X3QgdmFsOworCXVpbnQxNl90IHBtdWNudDI7CiAKIAlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSkgewogCWNhc2UgQ1BVX1ZSNDEyMjoKIAljYXNlIENQVV9WUjQxMzE6CiAJY2FzZSBDUFVfVlI0MTMzOgotCQl2YWwgPSByZWFkdyhQTVVDTlQyUkVHKTsKLQkJdmFsIHw9IFNPRlRSU1Q7Ci0JCXdyaXRldyh2YWwsIFBNVUNOVDJSRUcpOworCQlwbXVjbnQyID0gcG11X3JlYWQoUE1VQ05UMlJFRyk7CisJCXBtdWNudDIgfD0gU09GVFJTVDsKKwkJcG11X3dyaXRlKFBNVUNOVDJSRUcsIHBtdWNudDIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTcxLDYgKzg0LDM0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHZyNDF4eF9wbXVfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemU7CisKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSkgeworCWNhc2UgQ1BVX1ZSNDExMToKKwljYXNlIENQVV9WUjQxMjE6CisJCXN0YXJ0ID0gUE1VX1RZUEUxX0JBU0U7CisJCXNpemUgPSBQTVVfVFlQRTFfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfVlI0MTIyOgorCWNhc2UgQ1BVX1ZSNDEzMToKKwljYXNlIENQVV9WUjQxMzM6CisJCXN0YXJ0ID0gUE1VX1RZUEUyX0JBU0U7CisJCXNpemUgPSBQTVVfVFlQRTJfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmV4cGVjdGVkIENQVSBvZiBORUMgVlI0MTAwIHNlcmllc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oc3RhcnQsIHNpemUsICJQTVUiKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJcG11X2Jhc2UgPSBpb3JlbWFwKHN0YXJ0LCBzaXplKTsKKwlpZiAocG11X2Jhc2UgPT0gTlVMTCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oc3RhcnQsIHNpemUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwogCV9tYWNoaW5lX3Jlc3RhcnQgPSB2cjQxeHhfcmVzdGFydDsKIAlfbWFjaGluZV9oYWx0ID0gdnI0MXh4X2hhbHQ7CiAJX21hY2hpbmVfcG93ZXJfb2ZmID0gdnI0MXh4X3Bvd2VyX29mZjsKQEAgLTc4LDQgKzExOSw0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWVhcmx5X2luaXRjYWxsKHZyNDF4eF9wbXVfaW5pdCk7Citjb3JlX2luaXRjYWxsKHZyNDF4eF9wbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF80NHguUyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzQ0eC5TCmluZGV4IDliNmE4ZTUuLjZjN2FlNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzQ0eC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzQ0eC5TCkBAIC0zMzAsOCArMzMwLDkgQEAKIAkvKiBJZiB3ZSBhcmUgZmF1bHRpbmcgYSBrZXJuZWwgYWRkcmVzcywgd2UgaGF2ZSB0byB1c2UgdGhlCiAJICoga2VybmVsIHBhZ2UgdGFibGVzLgogCSAqLwotCWFuZGlzLglyMTEsIHIxMCwgMHg4MDAwCi0JYmVxCTNmCisJbGlzCXIxMSwgVEFTS19TSVpFQGgKKwljbXBsdwlyMTAsIHIxMQorCWJsdCsJM2YKIAlsaXMJcjExLCBzd2FwcGVyX3BnX2RpckBoCiAJb3JpCXIxMSwgcjExLCBzd2FwcGVyX3BnX2RpckBsCiAKQEAgLTQ2NCw4ICs0NjUsOSBAQAogCS8qIElmIHdlIGFyZSBmYXVsdGluZyBhIGtlcm5lbCBhZGRyZXNzLCB3ZSBoYXZlIHRvIHVzZSB0aGUKIAkgKiBrZXJuZWwgcGFnZSB0YWJsZXMuCiAJICovCi0JYW5kaXMuCXIxMSwgcjEwLCAweDgwMDAKLQliZXEJM2YKKwlsaXMJcjExLCBUQVNLX1NJWkVAaAorCWNtcGx3CXIxMCwgcjExCisJYmx0KwkzZgogCWxpcwlyMTEsIHN3YXBwZXJfcGdfZGlyQGgKIAlvcmkJcjExLCByMTEsIHN3YXBwZXJfcGdfZGlyQGwKIApAQCAtNTMzLDggKzUzNSw5IEBACiAJLyogSWYgd2UgYXJlIGZhdWx0aW5nIGEga2VybmVsIGFkZHJlc3MsIHdlIGhhdmUgdG8gdXNlIHRoZQogCSAqIGtlcm5lbCBwYWdlIHRhYmxlcy4KIAkgKi8KLQlhbmRpcy4JcjExLCByMTAsIDB4ODAwMAotCWJlcQkzZgorCWxpcwlyMTEsIFRBU0tfU0laRUBoCisJY21wbHcJcjEwLCByMTEKKwlibHQrCTNmCiAJbGlzCXIxMSwgc3dhcHBlcl9wZ19kaXJAaAogCW9yaQlyMTEsIHIxMSwgc3dhcHBlcl9wZ19kaXJAbAogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCmluZGV4IDVkZmI0MmYuLjVjMjAyNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCkBAIC00OTksNyArNDk5LDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByb21fc3Rkb3V0OwogCWNoYXIgKm5hbWU7Ci0JaW50IG9mZnNldDsKKwlpbnQgb2Zmc2V0ID0gMDsKIAogCWlmIChvZl9zdGRvdXRfZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzUzLDYgKzc1Myw4IEBACiAJc3RybGNweShzYXZlZF9jb21tYW5kX2xpbmUsIGNtZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CiAJKmNtZGxpbmVfcCA9IGNtZF9saW5lOwogCisJcGFyc2VfZWFybHlfcGFyYW0oKTsKKwogCS8qIHNldCB1cCB0aGUgYm9vdG1lbSBzdHVmZiB3aXRoIGF2YWlsYWJsZSBtZW1vcnkgKi8KIAlkb19pbml0X2Jvb3RtZW0oKTsKIAlpZiAoIHBwY19tZC5wcm9ncmVzcyApIHBwY19tZC5wcm9ncmVzcygic2V0dXBfYXJjaDogYm9vdG1lbSIsIDB4M2VhYik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9saWIvc3RyaW5nLlMgYi9hcmNoL3BwYy9saWIvc3RyaW5nLlMKaW5kZXggOGQwOGEyZS4uMzZjOWI5NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbGliL3N0cmluZy5TCisrKyBiL2FyY2gvcHBjL2xpYi9zdHJpbmcuUwpAQCAtNDQ2LDYgKzQ0Niw3IEBACiAjaWZkZWYgQ09ORklHXzh4eAogCS8qIERvbid0IHVzZSBwcmVmZXRjaCBvbiA4eHggKi8KIAltdGN0cglyMAorCWxpCXIwLDAKIDUzOglDT1BZXzE2X0JZVEVTX1dJVEhFWCgwKQogCWJkbnoJNTNiCiAKQEAgLTU2NCw3ICs1NjUsOSBAQAogLyogb3Igd3JpdGUgZmF1bHQgaW4gY2FjaGVsaW5lIGxvb3AgKi8KIDEwNToJbGkJcjksMQogOTI6CWxpCXIzLExHX0NBQ0hFTElORV9CWVRFUwotCWIJOTlmCisJbWZjdHIJcjgKKwlhZGQJcjAscjAscjgKKwliCTEwNmYKIC8qIHJlYWQgZmF1bHQgaW4gZmluYWwgd29yZCBsb29wICovCiAxMDg6CWxpCXI5LDAKIAliCTkzZgpAQCAtNTg1LDcgKzU4OCw3IEBACiAgKiByNSArIChjdHIgPDwgcjMpLCBhbmQgcjkgaXMgMCBmb3IgcmVhZCBvciAxIGZvciB3cml0ZS4KICAqLwogOTk6CW1mY3RyCXIwCi0Jc2x3CXIzLHIwLHIzCisxMDY6CXNsdwlyMyxyMCxyMwogCWFkZC4JcjMscjMscjUKIAliZXEJMTIwZgkJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KIAljbXB3aQkwLHI5LDAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL2luaXQuYyBiL2FyY2gvcHBjL21tL2luaXQuYwppbmRleCBiZTAyYTdmLi4zNjNjMTU3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9pbml0LmMKKysrIGIvYXJjaC9wcGMvbW0vaW5pdC5jCkBAIC0xNzksNiArMTc5LDcgQEAKIAlpZiAoIWhhdmVfb2YpCiAJCUZSRUVTRUMob3BlbmZpcm13YXJlKTsKICAJcHJpbnRrKCJcbiIpOworCXBwY19tZC5wcm9ncmVzcyA9IE5VTEw7CiAjdW5kZWYgRlJFRVNFQwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaXBpYy5jIGIvYXJjaC9wcGMvc3lzbGliL2lwaWMuYwppbmRleCBhY2IyY2RlLi41ODBlZDY1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvaXBpYy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMKQEAgLTQ3OSw3ICs0NzksNyBAQAogCXRlbXAgPSAwOwogCWZvciAoaSA9IDAgOyBpIDwgc2Vuc2VzX2NvdW50IDsgaSsrKSB7CiAJCWlmICgoc2Vuc2VzW2ldICYgSVJRX1NFTlNFX01BU0spID09IElSUV9TRU5TRV9FREdFKSB7Ci0JCQl0ZW1wIHw9IDEgPDwgKDE2IC0gaSk7CisJCQl0ZW1wIHw9IDEgPDwgKDE1IC0gaSk7CiAJCQlpZiAoaSAhPSAwKQogCQkJCWlycV9kZXNjW2kgKyBpcnFfb2Zmc2V0ICsgTVBDODN4eF9JUlFfRVhUMSAtIDFdLnN0YXR1cyA9IDA7CiAJCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKaW5kZXggNWMxYTkxOWUuLjc1YzhlOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKIAl9LAorCXsgfSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHBjX3N5c19wbGF0Zm9ybV9kZXZpY2VzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMKaW5kZXggYTIzMTc5NS4uMWU2NThlZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYwpAQCAtNjEsNiArNjEsNyBAQAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX1NIQVJFX0lSUSwKIAl9LAorCXsgfSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHBjX3N5c19wbGF0Zm9ybV9kZXZpY2VzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb3Blbl9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jCmluZGV4IDc2MTllMTYuLjlkNGVkNjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jCkBAIC01NTcsMTIgKzU1NywxMCBAQAogICovCiB2b2lkIG9wZW5waWNfY2F1c2VfSVBJKHVfaW50IGlwaSwgY3B1bWFza190IGNwdW1hc2spCiB7Ci0JY3B1bWFza190IHBoeXM7CiAJREVDTF9USElTX0NQVTsKIAogCUNIRUNLX1RISVNfQ1BVOwogCWNoZWNrX2FyZ19pcGkoaXBpKTsKLQlwaHlzID0gcGh5c21hc2soY3B1bWFzayk7CiAJb3BlbnBpY193cml0ZSgmT3BlblBJQy0+VEhJU19DUFUuSVBJX0Rpc3BhdGNoKGlwaSksCiAJCSAgICAgIGNwdXNfYWRkcihwaHlzbWFzayhjcHVtYXNrKSlbMF0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbWYuYyBiL2FyY2gvcHBjNjQva2VybmVsL21mLmMKaW5kZXggMWJkNTJlYy4uNWFjYTdlOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWYuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9tZi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgKiBtZi5jCiAgICogQ29weXJpZ2h0IChDKSAyMDAxIFRyb3kgRC4gQXJtc3Ryb25nICBJQk0gQ29ycG9yYXRpb24KLSAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3RlcGhlbiBSb3Rod2VsbCAgSUJNIENvcnBvcmF0aW9uCisgICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3RlcGhlbiBSb3Rod2VsbCAgSUJNIENvcnBvcmF0aW9uCiAgICoKICAgKiBUaGlzIG1vZHVsZXMgZXhpc3RzIGFzIGFuIGludGVyZmFjZSBiZXR3ZWVuIGEgTGludXggc2Vjb25kYXJ5IHBhcnRpdGlvbgogICAqIHJ1bm5pbmcgb24gYW4gaVNlcmllcyBhbmQgdGhlIHByaW1hcnkgcGFydGl0aW9uJ3MgVmlydHVhbCBTZXJ2aWNlCkBAIC0zNiwxMCArMzYsMTIgQEAKIAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL3Zpby5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL21mLmg+CiAjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcENvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0U3BDb21tQXJlYS5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0THBRdWV1ZS5oPgogCiAvKgogICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGxheW91dCBmb3IgdGhlIE1hY2hpbmUgRmFjaWxpdGVzIExQQVIgZXZlbnQKQEAgLTY5NiwzNiArNjk4LDIzIEBACiAJY29tcGxldGUoJnJ0Yy0+Y29tKTsKIH0KIAotaW50IG1mX2dldF9ydGMoc3RydWN0IHJ0Y190aW1lICp0bSkKK3N0YXRpYyBpbnQgcnRjX3NldF90bShpbnQgcmMsIHU4ICpjZV9tc2csIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7Ci0Jc3RydWN0IGNlX21zZ19jb21wX2RhdGEgY2VfY29tcGxldGU7Ci0Jc3RydWN0IHJ0Y190aW1lX2RhdGEgcnRjX2RhdGE7Ci0JaW50IHJjOwotCi0JbWVtc2V0KCZjZV9jb21wbGV0ZSwgMCwgc2l6ZW9mKGNlX2NvbXBsZXRlKSk7Ci0JbWVtc2V0KCZydGNfZGF0YSwgMCwgc2l6ZW9mKHJ0Y19kYXRhKSk7Ci0JaW5pdF9jb21wbGV0aW9uKCZydGNfZGF0YS5jb20pOwotCWNlX2NvbXBsZXRlLmhhbmRsZXIgPSAmZ2V0X3J0Y190aW1lX2NvbXBsZXRlOwotCWNlX2NvbXBsZXRlLnRva2VuID0gJnJ0Y19kYXRhOwotCXJjID0gc2lnbmFsX2NlX21zZ19zaW1wbGUoMHg0MCwgJmNlX2NvbXBsZXRlKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZydGNfZGF0YS5jb20pOwogCXRtLT50bV93ZGF5ID0gMDsKIAl0bS0+dG1feWRheSA9IDA7CiAJdG0tPnRtX2lzZHN0ID0gMDsKLQlpZiAocnRjX2RhdGEucmMpIHsKKwlpZiAocmMpIHsKIAkJdG0tPnRtX3NlYyA9IDA7CiAJCXRtLT50bV9taW4gPSAwOwogCQl0bS0+dG1faG91ciA9IDA7CiAJCXRtLT50bV9tZGF5ID0gMTU7CiAJCXRtLT50bV9tb24gPSA1OwogCQl0bS0+dG1feWVhciA9IDUyOwotCQlyZXR1cm4gcnRjX2RhdGEucmM7CisJCXJldHVybiByYzsKIAl9CiAKLQlpZiAoKHJ0Y19kYXRhLmNlX21zZy5jZV9tc2dbMl0gPT0gMHhhOSkgfHwKLQkgICAgKHJ0Y19kYXRhLmNlX21zZy5jZV9tc2dbMl0gPT0gMHhhZikpIHsKKwlpZiAoKGNlX21zZ1syXSA9PSAweGE5KSB8fAorCSAgICAoY2VfbXNnWzJdID09IDB4YWYpKSB7CiAJCS8qIFRPRCBjbG9jayBpcyBub3Qgc2V0ICovCiAJCXRtLT50bV9zZWMgPSAxOwogCQl0bS0+dG1fbWluID0gMTsKQEAgLTczNiw3ICs3MjUsNiBAQAogCQltZl9zZXRfcnRjKHRtKTsKIAl9CiAJewotCQl1OCAqY2VfbXNnID0gcnRjX2RhdGEuY2VfbXNnLmNlX21zZzsKIAkJdTggeWVhciA9IGNlX21zZ1s1XTsKIAkJdTggc2VjID0gY2VfbXNnWzZdOwogCQl1OCBtaW4gPSBjZV9tc2dbN107CkBAIC03NjUsNiArNzUzLDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBtZl9nZXRfcnRjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGNlX21zZ19jb21wX2RhdGEgY2VfY29tcGxldGU7CisJc3RydWN0IHJ0Y190aW1lX2RhdGEgcnRjX2RhdGE7CisJaW50IHJjOworCisJbWVtc2V0KCZjZV9jb21wbGV0ZSwgMCwgc2l6ZW9mKGNlX2NvbXBsZXRlKSk7CisJbWVtc2V0KCZydGNfZGF0YSwgMCwgc2l6ZW9mKHJ0Y19kYXRhKSk7CisJaW5pdF9jb21wbGV0aW9uKCZydGNfZGF0YS5jb20pOworCWNlX2NvbXBsZXRlLmhhbmRsZXIgPSAmZ2V0X3J0Y190aW1lX2NvbXBsZXRlOworCWNlX2NvbXBsZXRlLnRva2VuID0gJnJ0Y19kYXRhOworCXJjID0gc2lnbmFsX2NlX21zZ19zaW1wbGUoMHg0MCwgJmNlX2NvbXBsZXRlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZydGNfZGF0YS5jb20pOworCXJldHVybiBydGNfc2V0X3RtKHJ0Y19kYXRhLnJjLCBydGNfZGF0YS5jZV9tc2cuY2VfbXNnLCB0bSk7Cit9CisKK3N0cnVjdCBib290X3J0Y190aW1lX2RhdGEgeworCWludCBidXN5OworCXN0cnVjdCBjZV9tc2dfZGF0YSBjZV9tc2c7CisJaW50IHJjOworfTsKKworc3RhdGljIHZvaWQgZ2V0X2Jvb3RfcnRjX3RpbWVfY29tcGxldGUodm9pZCAqdG9rZW4sIHN0cnVjdCBjZV9tc2dfZGF0YSAqY2VfbXNnKQoreworCXN0cnVjdCBib290X3J0Y190aW1lX2RhdGEgKnJ0YyA9IHRva2VuOworCisJbWVtY3B5KCZydGMtPmNlX21zZywgY2VfbXNnLCBzaXplb2YocnRjLT5jZV9tc2cpKTsKKwlydGMtPnJjID0gMDsKKwlydGMtPmJ1c3kgPSAwOworfQorCitpbnQgbWZfZ2V0X2Jvb3RfcnRjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGNlX21zZ19jb21wX2RhdGEgY2VfY29tcGxldGU7CisJc3RydWN0IGJvb3RfcnRjX3RpbWVfZGF0YSBydGNfZGF0YTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJmNlX2NvbXBsZXRlLCAwLCBzaXplb2YoY2VfY29tcGxldGUpKTsKKwltZW1zZXQoJnJ0Y19kYXRhLCAwLCBzaXplb2YocnRjX2RhdGEpKTsKKwlydGNfZGF0YS5idXN5ID0gMTsKKwljZV9jb21wbGV0ZS5oYW5kbGVyID0gJmdldF9ib290X3J0Y190aW1lX2NvbXBsZXRlOworCWNlX2NvbXBsZXRlLnRva2VuID0gJnJ0Y19kYXRhOworCXJjID0gc2lnbmFsX2NlX21zZ19zaW1wbGUoMHg0MCwgJmNlX2NvbXBsZXRlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkvKiBXZSBuZWVkIHRvIHBvbGwgaGVyZSBhcyB3ZSBhcmUgbm90IHlldCB0YWtpbmcgaW50ZXJydXB0cyAqLworCXdoaWxlIChydGNfZGF0YS5idXN5KSB7CisJCWV4dGVybiB1bnNpZ25lZCBsb25nIGxwZXZlbnRfY291bnQ7CisJCXN0cnVjdCBJdExwUXVldWUgKmxwcSA9IGdldF9wYWNhKCktPmxwcXVldWVfcHRyOworCQlpZiAobHBxICYmIEl0THBRdWV1ZV9pc0xwSW50UGVuZGluZyhscHEpKQorCQkJbHBldmVudF9jb3VudCArPSBJdExwUXVldWVfcHJvY2VzcyhscHEsIE5VTEwpOworCX0KKwlyZXR1cm4gcnRjX3NldF90bShydGNfZGF0YS5yYywgcnRjX2RhdGEuY2VfbXNnLmNlX21zZywgdG0pOworfQorCiBpbnQgbWZfc2V0X3J0YyhzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewogCWNoYXIgY2VfdGltZVsxMl07CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NtcC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19zbXAuYwppbmRleCBjMjc1ODhlLi5hMjNkZTM3IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NtcC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc21wLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAogc3RhdGljIHZvaWQgKCpwbWFjX3RiX2ZyZWV6ZSkoaW50IGZyZWV6ZSk7CiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdDsKK3N0YXRpYyB1OCBwbWFjX3RiX3B1bHNhcl9hZGRyOwogc3RhdGljIERFRklORV9TUElOTE9DSyh0aW1lYmFzZV9sb2NrKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWViYXNlOwogCkBAIC0xMDYsMTIgKzEwNyw5IEBACiAJdTggZGF0YTsKIAlpbnQgcmM7CiAKLQkvKiBTdHJhbmdlbHksIHRoZSBkZXZpY2UtdHJlZSBzYXlzIGFkZHJlc3MgaXMgMHhkMiwgYnV0IGRhcndpbgotCSAqIGFjY2Vzc2VzIDB4ZDAgLi4uCi0JICovCiAJcG1hY19sb3dfaTJjX3NldG1vZGUocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsIHBtYWNfbG93X2kyY19tb2RlX2NvbWJpbmVkKTsKIAlyYyA9IHBtYWNfbG93X2kyY194ZmVyKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LAotCQkJICAgICAgIDB4ZDQgfCBwbWFjX2xvd19pMmNfcmVhZCwKKwkJCSAgICAgICBwbWFjX3RiX3B1bHNhcl9hZGRyIHwgcG1hY19sb3dfaTJjX3JlYWQsCiAJCQkgICAgICAgMHgyZSwgJmRhdGEsIDEpOwogCWlmIChyYyAhPSAwKQogCQlnb3RvIGJhaWw7CkBAIC0xMjAsNyArMTE4LDcgQEAKIAogCXBtYWNfbG93X2kyY19zZXRtb2RlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCBwbWFjX2xvd19pMmNfbW9kZV9zdGRzdWIpOwogCXJjID0gcG1hY19sb3dfaTJjX3hmZXIocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsCi0JCQkgICAgICAgMHhkNCB8IHBtYWNfbG93X2kyY193cml0ZSwKKwkJCSAgICAgICBwbWFjX3RiX3B1bHNhcl9hZGRyIHwgcG1hY19sb3dfaTJjX3dyaXRlLAogCQkJICAgICAgIDB4MmUsICZkYXRhLCAxKTsKICBiYWlsOgogCWlmIChyYyAhPSAwKSB7CkBAIC0xODUsNiArMTgzLDEyIEBACiAJaWYgKG5jcHVzIDw9IDEpCiAJCXJldHVybiAxOwogCisJLyogSFcgc3luYyBvbmx5IG9uIHRoZXNlIHBsYXRmb3JtcyAqLworCWlmICghbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzcsMiIpICYmCisJICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywzIikgJiYKKwkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUmFja01hYzMsMSIpKQorCQlnb3RvIG5vaHdzeW5jOworCiAJLyogTG9vayBmb3IgdGhlIGNsb2NrIGNoaXAgKi8KIAlmb3IgKGNjID0gTlVMTDsgKGNjID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoY2MsICJpMmMtaHdjbG9jayIpKSAhPSBOVUxMOykgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnAgPSBvZl9nZXRfcGFyZW50KGNjKTsKQEAgLTE5OCwxMSArMjAyLDE4IEBACiAJCQlnb3RvIG5leHQ7CiAJCXN3aXRjaCAoKnJlZykgewogCQljYXNlIDB4ZDI6Ci0JCQlwbWFjX3RiX2ZyZWV6ZSA9IHNtcF9jb3JlOTlfY3lwcmVzc190Yl9mcmVlemU7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJUaW1lYmFzZSBjbG9jayBpcyBDeXByZXNzIGNoaXBcbiIpOworCQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGNjLCAicHVsc2FyLWxlZ2FjeS1zbGV3aW5nIikpIHsKKwkJCQlwbWFjX3RiX2ZyZWV6ZSA9IHNtcF9jb3JlOTlfcHVsc2FyX3RiX2ZyZWV6ZTsKKwkJCQlwbWFjX3RiX3B1bHNhcl9hZGRyID0gMHhkMjsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJUaW1lYmFzZSBjbG9jayBpcyBQdWxzYXIgY2hpcFxuIik7CisJCQl9IGVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGNjLCAiY3kyODUwOCIpKSB7CisJCQkJcG1hY190Yl9mcmVlemUgPSBzbXBfY29yZTk5X2N5cHJlc3NfdGJfZnJlZXplOworCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWViYXNlIGNsb2NrIGlzIEN5cHJlc3MgY2hpcFxuIik7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAweGQ0OgogCQkJcG1hY190Yl9mcmVlemUgPSBzbXBfY29yZTk5X3B1bHNhcl90Yl9mcmVlemU7CisJCQlwbWFjX3RiX3B1bHNhcl9hZGRyID0gMHhkNDsKIAkJCXByaW50ayhLRVJOX0lORk8gIlRpbWViYXNlIGNsb2NrIGlzIFB1bHNhciBjaGlwXG4iKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMTAsMTIgKzIyMSwxNSBAQAogCQkJcG1hY190Yl9jbG9ja19jaGlwX2hvc3QgPSBwOwogCQkJc21wX29wcy0+Z2l2ZV90aW1lYmFzZSA9IHNtcF9jb3JlOTlfZ2l2ZV90aW1lYmFzZTsKIAkJCXNtcF9vcHMtPnRha2VfdGltZWJhc2UgPSBzbXBfY29yZTk5X3Rha2VfdGltZWJhc2U7CisJCQlvZl9ub2RlX3B1dChjYyk7CisJCQlvZl9ub2RlX3B1dChwKTsKIAkJCWJyZWFrOwogCQl9CiAJbmV4dDoKIAkJb2Zfbm9kZV9wdXQocCk7CiAJfQogCisgbm9od3N5bmM6CiAJbXBpY19yZXF1ZXN0X2lwaXMoKTsKIAogCXJldHVybiBuY3B1czsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Byb21faW5pdC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggMzVlYzQyZC4uNmY3OWI3YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTE3NTAsNyArMTc1MCw0NCBAQAogCXByb21fcHJpbnRmKCJEZXZpY2UgdHJlZSBzdHJ1Y3QgIDB4JXggLT4gMHgleFxuIiwKIAkJICAgIFJFTE9DKGR0X3N0cnVjdF9zdGFydCksIFJFTE9DKGR0X3N0cnVjdF9lbmQpKTsKIAotIH0KK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgZml4dXBfZGV2aWNlX3RyZWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlbG9jX29mZnNldCgpOworCXBoYW5kbGUgdTMsIGkyYywgbXBpYzsKKwl1MzIgdTNfcmV2OworCXUzMiBpbnRlcnJ1cHRzWzJdOworCXUzMiBwYXJlbnQ7CisKKwkvKiBTb21lIEc1cyBoYXZlIGEgbWlzc2luZyBpbnRlcnJ1cHQgZGVmaW5pdGlvbiwgZml4IGl0IHVwIGhlcmUgKi8KKwl1MyA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIoIi91M0AwLGY4MDAwMDAwIikpOworCWlmICgobG9uZyl1MyA8PSAwKQorCQlyZXR1cm47CisJaTJjID0gY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgQUREUigiL3UzQDAsZjgwMDAwMDAvaTJjQGY4MDAxMDAwIikpOworCWlmICgobG9uZylpMmMgPD0gMCkKKwkJcmV0dXJuOworCW1waWMgPSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBBRERSKCIvdTNAMCxmODAwMDAwMC9tcGljQGY4MDQwMDAwIikpOworCWlmICgobG9uZyltcGljIDw9IDApCisJCXJldHVybjsKKworCS8qIGNoZWNrIGlmIHByb3BlciByZXYgb2YgdTMgKi8KKwlpZiAocHJvbV9nZXRwcm9wKHUzLCAiZGV2aWNlLXJldiIsICZ1M19yZXYsIHNpemVvZih1M19yZXYpKSA8PSAwKQorCQlyZXR1cm47CisJaWYgKHUzX3JldiAhPSAweDM1KQorCQlyZXR1cm47CisJLyogZG9lcyBpdCBuZWVkIGZpeHVwID8gKi8KKwlpZiAocHJvbV9nZXRwcm9wbGVuKGkyYywgImludGVycnVwdHMiKSA+IDApCisJCXJldHVybjsKKwkvKiBpbnRlcnJ1cHQgb24gdGhpcyByZXZpc2lvbiBvZiB1MyBpcyBudW1iZXIgMCBhbmQgbGV2ZWwgKi8KKwlpbnRlcnJ1cHRzWzBdID0gMDsKKwlpbnRlcnJ1cHRzWzFdID0gMTsKKwlwcm9tX3NldHByb3AoaTJjLCAiaW50ZXJydXB0cyIsICZpbnRlcnJ1cHRzLCBzaXplb2YoaW50ZXJydXB0cykpOworCXBhcmVudCA9ICh1MzIpbXBpYzsKKwlwcm9tX3NldHByb3AoaTJjLCAiaW50ZXJydXB0LXBhcmVudCIsICZwYXJlbnQsIHNpemVvZihwYXJlbnQpKTsKK30KKwogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHJvbV9maW5kX2Jvb3RfY3B1KHZvaWQpCiB7CkBAIC0xOTIwLDYgKzE5NTcsMTEgQEAKIAl9CiAKIAkvKgorCSAqIEZpeHVwIGFueSBrbm93biBidWdzIGluIHRoZSBkZXZpY2UtdHJlZQorCSAqLworCWZpeHVwX2RldmljZV90cmVlKCk7CisKKwkvKgogCSAqIE5vdyBmaW5hbGx5IGNyZWF0ZSB0aGUgZmxhdHRlbmVkIGRldmljZS10cmVlCiAJICovCiAgICAgICAgCXByb21fcHJpbnRmKCJjb3B5aW5nIE9GIGRldmljZSB0cmVlIC4uLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9ydGMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3J0Yy5jCmluZGV4IDNlNzBiOTEuLjY3OTg5MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3J0Yy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3J0Yy5jCkBAIC0yOTIsNDcgKzI5MiwxMCBAQAogCiB2b2lkIGlTZXJpZXNfZ2V0X2Jvb3RfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewotCXVuc2lnbmVkIGxvbmcgdGltZTsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0c2VjID0gMTsKLQotCXUzMiBkYXRhV29yZDEgPSAqKCh1MzIgKikoJnhTcENvbW1BcmVhLnhCY2RUaW1lQXRJcGxTdGFydCkpOwotCXUzMiBkYXRhV29yZDIgPSAqKCgodTMyICopJih4U3BDb21tQXJlYS54QmNkVGltZUF0SXBsU3RhcnQpKSArIDEpOwotCWludCB5ZWFyID0gMTk3MDsKLQlpbnQgeWVhcjEgPSAoIGRhdGFXb3JkMSA+PiAyNCApICYgMHgwMDAwMDBGRjsKLQlpbnQgeWVhcjIgPSAoIGRhdGFXb3JkMSA+PiAxNiApICYgMHgwMDAwMDBGRjsKLQlpbnQgc2VjID0gKCBkYXRhV29yZDEgPj4gOCApICYgMHgwMDAwMDBGRjsKLQlpbnQgbWluID0gZGF0YVdvcmQxICYgMHgwMDAwMDBGRjsKLQlpbnQgaG91ciA9ICggZGF0YVdvcmQyID4+IDI0ICkgJiAweDAwMDAwMEZGOwotCWludCBkYXkgPSAoIGRhdGFXb3JkMiA+PiA4ICkgJiAweDAwMDAwMEZGOwotCWludCBtb24gPSBkYXRhV29yZDIgJiAweDAwMDAwMEZGOwotCiAJaWYgKCBwaXJhbmhhX3NpbXVsYXRvciApCiAJCXJldHVybjsKIAotCUJDRF9UT19CSU4oc2VjKTsKLQlCQ0RfVE9fQklOKG1pbik7Ci0JQkNEX1RPX0JJTihob3VyKTsKLQlCQ0RfVE9fQklOKGRheSk7Ci0JQkNEX1RPX0JJTihtb24pOwotCUJDRF9UT19CSU4oeWVhcjEpOwotCUJDRF9UT19CSU4oeWVhcjIpOwotCXllYXIgPSB5ZWFyMSAqIDEwMCArIHllYXIyOwotCi0JdGltZSA9IG1rdGltZSh5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWMpOwotCXRpbWUgKz0gKCBqaWZmaWVzIC8gSFogKTsKLQotCS8qIE5vdyBUSElTIGlzIGEgbmFzdHkgaGFjayEKLQkqIEl0IGVuc3VyZXMgdGhhdCB0aGUgZmlyc3QgdHdvIGNhbGxzIGdldCBkaWZmZXJlbnQgYW5zd2Vycy4gIAotCSogVGhhdCB3YXkgdGhlIGxvb3AgaW4gaW5pdF90aW1lICh0aW1lLmMpIHdpbGwgbm90IHRoaW5rCi0JKiB0aGUgY2xvY2sgaXMgc3R1Y2suCi0JKi8KLQlpZiAoIGxhc3RzZWMgKSB7Ci0JCXRpbWUgLT0gbGFzdHNlYzsKLQkJLS1sYXN0c2VjOwotCX0KLQotCXRvX3RtKHRpbWUsIHRtKTsgCi0JdG0tPnRtX3llYXIgLT0gMTkwMDsKKwltZl9nZXRfYm9vdF9ydGModG0pOwogCXRtLT50bV9tb24gIC09IDE7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYwppbmRleCA3NzJhNDY1Li4zZDU0NzQ1IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdGltZS5jCkBAIC01MTUsNiArNTE1LDcgQEAKIAlkb19ndG9kLnZhcnAgPSAmZG9fZ3RvZC52YXJzWzBdOwogCWRvX2d0b2QudmFyX2lkeCA9IDA7CiAJZG9fZ3RvZC52YXJwLT50Yl9vcmlnX3N0YW1wID0gdGJfbGFzdF9zdGFtcDsKKwlnZXRfcGFjYSgpLT5uZXh0X2ppZmZ5X3VwZGF0ZV90YiA9IHRiX2xhc3Rfc3RhbXAgKyB0Yl90aWNrc19wZXJfamlmZnk7CiAJZG9fZ3RvZC52YXJwLT5zdGFtcF94c2VjID0geHRpbWUudHZfc2VjICogWFNFQ19QRVJfU0VDOwogCWRvX2d0b2QudGJfdGlja3NfcGVyX3NlYyA9IHRiX3RpY2tzX3Blcl9zZWM7CiAJZG9fZ3RvZC52YXJwLT50Yl90b194cyA9IHRiX3RvX3hzOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggMjkyOTgzNC4uMzNjYTU2YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pb21tdS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3BibS5oPgogCkBAIC0zNzksNiArMzgwLDU2IEBACiAJcmV0dXJuIFBDSV9ETUFfRVJST1JfQ09ERTsKIH0KIAorc3RhdGljIHZvaWQgcGNpX3N0cmJ1Zl9mbHVzaChzdHJ1Y3QgcGNpX3N0cmJ1ZiAqc3RyYnVmLCBzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSwgdTMyIHZhZGRyLCB1bnNpZ25lZCBsb25nIGN0eCwgdW5zaWduZWQgbG9uZyBucGFnZXMpCit7CisJaW50IGxpbWl0OworCisJUENJX1NUQ19GTFVTSEZMQUdfSU5JVChzdHJidWYpOworCWlmIChzdHJidWYtPnN0cmJ1Zl9jdHhmbHVzaCAmJgorCSAgICBpb21tdS0+aW9tbXVfY3R4Zmx1c2gpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXRjaHJlZywgZmx1c2hyZWc7CisKKwkJZmx1c2hyZWcgPSBzdHJidWYtPnN0cmJ1Zl9jdHhmbHVzaDsKKwkJbWF0Y2hyZWcgPSBQQ0lfU1RDX0NUWE1BVENIX0FERFIoc3RyYnVmLCBjdHgpOworCisJCWxpbWl0ID0gMTAwMDAwOworCQlwY2lfaW9tbXVfd3JpdGUoZmx1c2hyZWcsIGN0eCk7CisJCWZvcig7OykgeworCQkJaWYgKCgobG9uZylwY2lfaW9tbXVfcmVhZChtYXRjaHJlZykpID49IDBMKQorCQkJCWJyZWFrOworCQkJbGltaXQtLTsKKwkJCWlmICghbGltaXQpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJaWYgKCFsaW1pdCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaV9zdHJidWZfZmx1c2g6IGN0eCBmbHVzaCAiCisJCQkgICAgICAgInRpbWVvdXQgdmFkZHJbJTA4eF0gY3R4WyVseF1cbiIsCisJCQkgICAgICAgdmFkZHIsIGN0eCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBpOworCisJCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKywgdmFkZHIgKz0gSU9fUEFHRV9TSVpFKQorCQkJcGNpX2lvbW11X3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX3BmbHVzaCwgdmFkZHIpOworCX0KKworCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9mc3luYywgc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnX3BhKTsKKwkodm9pZCkgcGNpX2lvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CisKKwlsaW1pdCA9IDEwMDAwMDsKKwl3aGlsZSAoIVBDSV9TVENfRkxVU0hGTEFHX1NFVChzdHJidWYpKSB7CisJCWxpbWl0LS07CisJCWlmICghbGltaXQpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCQltZW1iYXIoIiNMb2FkTG9hZCIpOworCX0KKwlpZiAoIWxpbWl0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfc3RyYnVmX2ZsdXNoOiBmbHVzaGZsYWcgdGltZW91dCAiCisJCSAgICAgICAidmFkZHJbJTA4eF0gY3R4WyVseF0gbnBhZ2VzWyVsZF1cbiIsCisJCSAgICAgICB2YWRkciwgY3R4LCBucGFnZXMpOworfQorCiAvKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICovCiB2b2lkIHBjaV91bm1hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKIHsKQEAgLTM4Niw3ICs0MzcsNyBAQAogCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OwogCXN0cnVjdCBwY2lfc3RyYnVmICpzdHJidWY7CiAJaW9wdGVfdCAqYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGksIGN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGN0eDsKIAogCWlmIChkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKQogCQlCVUcoKTsKQEAgLTQxNCwyOSArNDY1LDggQEAKIAkJY3R4ID0gKGlvcHRlX3ZhbCgqYmFzZSkgJiBJT1BURV9DT05URVhUKSA+PiA0N1VMOwogCiAJLyogU3RlcCAxOiBLaWNrIGRhdGEgb3V0IG9mIHN0cmVhbWluZyBidWZmZXJzIGlmIG5lY2Vzc2FyeS4gKi8KLQlpZiAoc3RyYnVmLT5zdHJidWZfZW5hYmxlZCkgewotCQl1MzIgdmFkZHIgPSBidXNfYWRkcjsKLQotCQlQQ0lfU1RDX0ZMVVNIRkxBR19JTklUKHN0cmJ1Zik7Ci0JCWlmIChzdHJidWYtPnN0cmJ1Zl9jdHhmbHVzaCAmJgotCQkgICAgaW9tbXUtPmlvbW11X2N0eGZsdXNoKSB7Ci0JCQl1bnNpZ25lZCBsb25nIG1hdGNocmVnLCBmbHVzaHJlZzsKLQotCQkJZmx1c2hyZWcgPSBzdHJidWYtPnN0cmJ1Zl9jdHhmbHVzaDsKLQkJCW1hdGNocmVnID0gUENJX1NUQ19DVFhNQVRDSF9BRERSKHN0cmJ1ZiwgY3R4KTsKLQkJCWRvIHsKLQkJCQlwY2lfaW9tbXVfd3JpdGUoZmx1c2hyZWcsIGN0eCk7Ci0JCQl9IHdoaWxlKCgobG9uZylwY2lfaW9tbXVfcmVhZChtYXRjaHJlZykpIDwgMEwpOwotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrLCB2YWRkciArPSBJT19QQUdFX1NJWkUpCi0JCQkJcGNpX2lvbW11X3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX3BmbHVzaCwgdmFkZHIpOwotCQl9Ci0KLQkJcGNpX2lvbW11X3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX2ZzeW5jLCBzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWdfcGEpOwotCQkodm9pZCkgcGNpX2lvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7Ci0JCXdoaWxlICghUENJX1NUQ19GTFVTSEZMQUdfU0VUKHN0cmJ1ZikpCi0JCQltZW1iYXIoIiNMb2FkTG9hZCIpOwotCX0KKwlpZiAoc3RyYnVmLT5zdHJidWZfZW5hYmxlZCkKKwkJcGNpX3N0cmJ1Zl9mbHVzaChzdHJidWYsIGlvbW11LCBidXNfYWRkciwgY3R4LCBucGFnZXMpOwogCiAJLyogU3RlcCAyOiBDbGVhciBvdXQgZmlyc3QgVFNCIGVudHJ5LiAqLwogCWlvcHRlX21ha2VfZHVtbXkoaW9tbXUsIGJhc2UpOwpAQCAtNjQ3LDI5ICs2NzcsOCBAQAogCQljdHggPSAoaW9wdGVfdmFsKCpiYXNlKSAmIElPUFRFX0NPTlRFWFQpID4+IDQ3VUw7CiAKIAkvKiBTdGVwIDE6IEtpY2sgZGF0YSBvdXQgb2Ygc3RyZWFtaW5nIGJ1ZmZlcnMgaWYgbmVjZXNzYXJ5LiAqLwotCWlmIChzdHJidWYtPnN0cmJ1Zl9lbmFibGVkKSB7Ci0JCXUzMiB2YWRkciA9ICh1MzIpIGJ1c19hZGRyOwotCi0JCVBDSV9TVENfRkxVU0hGTEFHX0lOSVQoc3RyYnVmKTsKLQkJaWYgKHN0cmJ1Zi0+c3RyYnVmX2N0eGZsdXNoICYmCi0JCSAgICBpb21tdS0+aW9tbXVfY3R4Zmx1c2gpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbWF0Y2hyZWcsIGZsdXNocmVnOwotCi0JCQlmbHVzaHJlZyA9IHN0cmJ1Zi0+c3RyYnVmX2N0eGZsdXNoOwotCQkJbWF0Y2hyZWcgPSBQQ0lfU1RDX0NUWE1BVENIX0FERFIoc3RyYnVmLCBjdHgpOwotCQkJZG8gewotCQkJCXBjaV9pb21tdV93cml0ZShmbHVzaHJlZywgY3R4KTsKLQkJCX0gd2hpbGUoKChsb25nKXBjaV9pb21tdV9yZWFkKG1hdGNocmVnKSkgPCAwTCk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIHZhZGRyICs9IElPX1BBR0VfU0laRSkKLQkJCQlwY2lfaW9tbXVfd3JpdGUoc3RyYnVmLT5zdHJidWZfcGZsdXNoLCB2YWRkcik7Ci0JCX0KLQotCQlwY2lfaW9tbXVfd3JpdGUoc3RyYnVmLT5zdHJidWZfZnN5bmMsIHN0cmJ1Zi0+c3RyYnVmX2ZsdXNoZmxhZ19wYSk7Ci0JCSh2b2lkKSBwY2lfaW9tbXVfcmVhZChpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnKTsKLQkJd2hpbGUgKCFQQ0lfU1RDX0ZMVVNIRkxBR19TRVQoc3RyYnVmKSkKLQkJCW1lbWJhcigiI0xvYWRMb2FkIik7Ci0JfQorCWlmIChzdHJidWYtPnN0cmJ1Zl9lbmFibGVkKQorCQlwY2lfc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsIG5wYWdlcyk7CiAKIAkvKiBTdGVwIDI6IENsZWFyIG91dCBmaXJzdCBUU0IgZW50cnkuICovCiAJaW9wdGVfbWFrZV9kdW1teShpb21tdSwgYmFzZSk7CkBAIC03MTUsMjggKzcyNCw3IEBACiAJfQogCiAJLyogU3RlcCAyOiBLaWNrIGRhdGEgb3V0IG9mIHN0cmVhbWluZyBidWZmZXJzLiAqLwotCVBDSV9TVENfRkxVU0hGTEFHX0lOSVQoc3RyYnVmKTsKLQlpZiAoaW9tbXUtPmlvbW11X2N0eGZsdXNoICYmCi0JICAgIHN0cmJ1Zi0+c3RyYnVmX2N0eGZsdXNoKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWF0Y2hyZWcsIGZsdXNocmVnOwotCi0JCWZsdXNocmVnID0gc3RyYnVmLT5zdHJidWZfY3R4Zmx1c2g7Ci0JCW1hdGNocmVnID0gUENJX1NUQ19DVFhNQVRDSF9BRERSKHN0cmJ1ZiwgY3R4KTsKLQkJZG8gewotCQkJcGNpX2lvbW11X3dyaXRlKGZsdXNocmVnLCBjdHgpOwotCQl9IHdoaWxlKCgobG9uZylwY2lfaW9tbXVfcmVhZChtYXRjaHJlZykpIDwgMEwpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIGJ1c19hZGRyICs9IElPX1BBR0VfU0laRSkKLQkJCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9wZmx1c2gsIGJ1c19hZGRyKTsKLQl9Ci0KLQkvKiBTdGVwIDM6IFBlcmZvcm0gZmx1c2ggc3luY2hyb25pemF0aW9uIHNlcXVlbmNlLiAqLwotCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9mc3luYywgc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnX3BhKTsKLQkodm9pZCkgcGNpX2lvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7Ci0Jd2hpbGUgKCFQQ0lfU1RDX0ZMVVNIRkxBR19TRVQoc3RyYnVmKSkKLQkJbWVtYmFyKCIjTG9hZExvYWQiKTsKKwlwY2lfc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsIG5wYWdlcyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogfQpAQCAtNzQ5LDcgKzczNyw4IEBACiAJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdTsKIAlzdHJ1Y3QgcGNpX3N0cmJ1ZiAqc3RyYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBjdHgsIG5wYWdlcywgaTsKKwl1MzIgYnVzX2FkZHI7CiAKIAlwY3AgPSBwZGV2LT5zeXNkYXRhOwogCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OwpAQCAtNzcyLDM2ICs3NjEsMTQgQEAKIAl9CiAKIAkvKiBTdGVwIDI6IEtpY2sgZGF0YSBvdXQgb2Ygc3RyZWFtaW5nIGJ1ZmZlcnMuICovCi0JUENJX1NUQ19GTFVTSEZMQUdfSU5JVChzdHJidWYpOwotCWlmIChpb21tdS0+aW9tbXVfY3R4Zmx1c2ggJiYKLQkgICAgc3RyYnVmLT5zdHJidWZfY3R4Zmx1c2gpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXRjaHJlZywgZmx1c2hyZWc7Ci0KLQkJZmx1c2hyZWcgPSBzdHJidWYtPnN0cmJ1Zl9jdHhmbHVzaDsKLQkJbWF0Y2hyZWcgPSBQQ0lfU1RDX0NUWE1BVENIX0FERFIoc3RyYnVmLCBjdHgpOwotCQlkbyB7Ci0JCQlwY2lfaW9tbXVfd3JpdGUoZmx1c2hyZWcsIGN0eCk7Ci0JCX0gd2hpbGUgKCgobG9uZylwY2lfaW9tbXVfcmVhZChtYXRjaHJlZykpIDwgMEwpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzOwotCQl1MzIgYnVzX2FkZHI7Ci0KLQkJYnVzX2FkZHIgPSBzZ2xpc3RbMF0uZG1hX2FkZHJlc3MgJiBJT19QQUdFX01BU0s7Ci0KLQkJZm9yKGkgPSAxOyBpIDwgbmVsZW1zOyBpKyspCi0JCQlpZiAoIXNnbGlzdFtpXS5kbWFfbGVuZ3RoKQotCQkJCWJyZWFrOwotCQlpLS07Ci0JCW5wYWdlcyA9IChJT19QQUdFX0FMSUdOKHNnbGlzdFtpXS5kbWFfYWRkcmVzcyArIHNnbGlzdFtpXS5kbWFfbGVuZ3RoKSAtIGJ1c19hZGRyKSA+PiBJT19QQUdFX1NISUZUOwotCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIGJ1c19hZGRyICs9IElPX1BBR0VfU0laRSkKLQkJCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9wZmx1c2gsIGJ1c19hZGRyKTsKLQl9Ci0KLQkvKiBTdGVwIDM6IFBlcmZvcm0gZmx1c2ggc3luY2hyb25pemF0aW9uIHNlcXVlbmNlLiAqLwotCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9mc3luYywgc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnX3BhKTsKLQkodm9pZCkgcGNpX2lvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7Ci0Jd2hpbGUgKCFQQ0lfU1RDX0ZMVVNIRkxBR19TRVQoc3RyYnVmKSkKLQkJbWVtYmFyKCIjTG9hZExvYWQiKTsKKwlidXNfYWRkciA9IHNnbGlzdFswXS5kbWFfYWRkcmVzcyAmIElPX1BBR0VfTUFTSzsKKwlmb3IoaSA9IDE7IGkgPCBuZWxlbXM7IGkrKykKKwkJaWYgKCFzZ2xpc3RbaV0uZG1hX2xlbmd0aCkKKwkJCWJyZWFrOworCWktLTsKKwlucGFnZXMgPSAoSU9fUEFHRV9BTElHTihzZ2xpc3RbaV0uZG1hX2FkZHJlc3MgKyBzZ2xpc3RbaV0uZG1hX2xlbmd0aCkKKwkJICAtIGJ1c19hZGRyKSA+PiBJT19QQUdFX1NISUZUOworCXBjaV9zdHJidWZfZmx1c2goc3RyYnVmLCBpb21tdSwgYnVzX2FkZHIsIGN0eCwgbnBhZ2VzKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCmluZGV4IDE0ZDljM2EuLjc2ZWE2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCkBAIC0xMTcsMTkgKzExNywzNCBAQAogCiAjZGVmaW5lIFNUUkJVRl9UQUdfVkFMSUQJMHgwMlVMCiAKLXN0YXRpYyB2b2lkIHN0cmJ1Zl9mbHVzaChzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXUsIHUzMiBiYXNlLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3N0YXRpYyB2b2lkIHNidXNfc3RyYnVmX2ZsdXNoKHN0cnVjdCBzYnVzX2lvbW11ICppb21tdSwgdTMyIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQogeworCXVuc2lnbmVkIGxvbmcgbjsKKwlpbnQgbGltaXQ7CisKIAlpb21tdS0+c3RyYnVmX2ZsdXNoZmxhZyA9IDBVTDsKLQl3aGlsZSAobnBhZ2VzLS0pCi0JCXVwYV93cml0ZXEoYmFzZSArIChucGFnZXMgPDwgSU9fUEFHRV9TSElGVCksCisJbiA9IG5wYWdlczsKKwl3aGlsZSAobi0tKQorCQl1cGFfd3JpdGVxKGJhc2UgKyAobiA8PCBJT19QQUdFX1NISUZUKSwKIAkJCSAgIGlvbW11LT5zdHJidWZfcmVncyArIFNUUkJVRl9QRkxVU0gpOwogCiAJLyogV2hvb3BlZSBjdXNoaW9uISAqLwogCXVwYV93cml0ZXEoX19wYSgmaW9tbXUtPnN0cmJ1Zl9mbHVzaGZsYWcpLAogCQkgICBpb21tdS0+c3RyYnVmX3JlZ3MgKyBTVFJCVUZfRlNZTkMpOwogCXVwYV9yZWFkcShpb21tdS0+c2J1c19jb250cm9sX3JlZyk7Ci0Jd2hpbGUgKGlvbW11LT5zdHJidWZfZmx1c2hmbGFnID09IDBVTCkKKworCWxpbWl0ID0gMTAwMDAwOworCXdoaWxlIChpb21tdS0+c3RyYnVmX2ZsdXNoZmxhZyA9PSAwVUwpIHsKKwkJbGltaXQtLTsKKwkJaWYgKCFsaW1pdCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CiAJCW1lbWJhcigiI0xvYWRMb2FkIik7CisJfQorCWlmICghbGltaXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNidXNfc3RyYnVmX2ZsdXNoOiBmbHVzaGZsYWcgdGltZW91dCAiCisJCSAgICAgICAidmFkZHJbJTA4eF0gbnBhZ2VzWyVsZF1cbiIsCisJCSAgICAgICBiYXNlLCBucGFnZXMpOwogfQogCiBzdGF0aWMgaW9wdGVfdCAqYWxsb2Nfc3RyZWFtaW5nX2NsdXN0ZXIoc3RydWN0IHNidXNfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKQEAgLTQwNiw3ICs0MjEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAJZnJlZV9zdHJlYW1pbmdfY2x1c3Rlcihpb21tdSwgZG1hX2Jhc2UsIHNpemUgPj4gSU9fUEFHRV9TSElGVCk7Ci0Jc3RyYnVmX2ZsdXNoKGlvbW11LCBkbWFfYmFzZSwgc2l6ZSA+PiBJT19QQUdFX1NISUZUKTsKKwlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgZG1hX2Jhc2UsIHNpemUgPj4gSU9fUEFHRV9TSElGVCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNTY5LDcgKzU4NCw3IEBACiAJaW9tbXUgPSBzZGV2LT5idXMtPmlvbW11OwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCWZyZWVfc3RyZWFtaW5nX2NsdXN0ZXIoaW9tbXUsIGR2bWFfYmFzZSwgc2l6ZSA+PiBJT19QQUdFX1NISUZUKTsKLQlzdHJidWZfZmx1c2goaW9tbXUsIGR2bWFfYmFzZSwgc2l6ZSA+PiBJT19QQUdFX1NISUZUKTsKKwlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgZHZtYV9iYXNlLCBzaXplID4+IElPX1BBR0VfU0hJRlQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTU4MSw3ICs1OTYsNyBAQAogCXNpemUgPSAoSU9fUEFHRV9BTElHTihiYXNlICsgc2l6ZSkgLSAoYmFzZSAmIElPX1BBR0VfTUFTSykpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jc3RyYnVmX2ZsdXNoKGlvbW11LCBiYXNlICYgSU9fUEFHRV9NQVNLLCBzaXplID4+IElPX1BBR0VfU0hJRlQpOworCXNidXNfc3RyYnVmX2ZsdXNoKGlvbW11LCBiYXNlICYgSU9fUEFHRV9NQVNLLCBzaXplID4+IElPX1BBR0VfU0hJRlQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTYwNSw3ICs2MjAsNyBAQAogCXNpemUgPSBJT19QQUdFX0FMSUdOKHNnW2ldLmRtYV9hZGRyZXNzICsgc2dbaV0uZG1hX2xlbmd0aCkgLSBiYXNlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jc3RyYnVmX2ZsdXNoKGlvbW11LCBiYXNlLCBzaXplID4+IElPX1BBR0VfU0hJRlQpOworCXNidXNfc3RyYnVmX2ZsdXNoKGlvbW11LCBiYXNlLCBzaXplID4+IElPX1BBR0VfU0hJRlQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQgYi9hcmNoL3VtL0tjb25maWdfeDg2XzY0CmluZGV4IGZkOGQ3ZTguLmYxNjJmNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQKKysrIGIvYXJjaC91bS9LY29uZmlnX3g4Nl82NApAQCAtNiw2ICs2LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgVE9QX0FERFIKKyAJaGV4CisJZGVmYXVsdCAweDgwMDAwMDAwCisKIGNvbmZpZyAzX0xFVkVMX1BHVEFCTEVTCiAgICAgICAgYm9vbAogICAgICAgIGRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCmluZGV4IDAxNTAwMzguLjE0YTEyZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKQEAgLTIwLDkgKzIwLDE3IEBACiAjaW5jbHVkZSAib3MuaCIKIAogI2lmZGVmIENPTkZJR19OT0NPTkZJR19DSEFOCisKKy8qIFRoZSBwcmludGsncyBoZXJlIGFyZSB3cm9uZyBiZWNhdXNlIHdlIGFyZSBjb21wbGFpbmluZyB0aGF0IHRoZXJlIGlzIG5vCisgKiBvdXRwdXQgZGV2aWNlLCBidXQgcHJpbnRrIGlzIHByaW50aW5nIHRvIHRoYXQgb3V0cHV0IGRldmljZS4gIFRoZSB1c2VyIHdpbGwKKyAqIG5ldmVyIHNlZSB0aGUgZXJyb3IuICBwcmludGYgd291bGQgYmUgYmV0dGVyLCBleGNlcHQgaXQgY2FuJ3QgcnVuIG9uIGEKKyAqIGtlcm5lbCBzdGFjayBiZWNhdXNlIGl0IHdpbGwgb3ZlcmZsb3cgaXQuCisgKiBVc2UgcHJpbnRrIGZvciBub3cgc2luY2UgdGhhdCB3aWxsIGF2b2lkIGNyYXNoaW5nLgorICovCisKIHN0YXRpYyB2b2lkICpub3RfY29uZmlnZ2VkX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewotCXByaW50ZihLRVJOX0VSUiAiVXNpbmcgYSBjaGFubmVsIHR5cGUgd2hpY2ggaXMgY29uZmlndXJlZCBvdXQgb2YgIgorCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgYSBjaGFubmVsIHR5cGUgd2hpY2ggaXMgY29uZmlndXJlZCBvdXQgb2YgIgogCSAgICAgICAiVU1MXG4iKTsKIAlyZXR1cm4oTlVMTCk7CiB9CkBAIC0zMCwyNyArMzgsMjcgQEAKIHN0YXRpYyBpbnQgbm90X2NvbmZpZ2dlZF9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmRhdGEsCiAJCQkgICAgICBjaGFyICoqZGV2X291dCkKIHsKLQlwcmludGYoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKKwlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKIAkgICAgICAgIlVNTFxuIik7CiAJcmV0dXJuKC1FTk9ERVYpOwogfQogCiBzdGF0aWMgdm9pZCBub3RfY29uZmlnZ2VkX2Nsb3NlKGludCBmZCwgdm9pZCAqZGF0YSkKIHsKLQlwcmludGYoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKKwlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKIAkgICAgICAgIlVNTFxuIik7CiB9CiAKIHN0YXRpYyBpbnQgbm90X2NvbmZpZ2dlZF9yZWFkKGludCBmZCwgY2hhciAqY19vdXQsIHZvaWQgKmRhdGEpCiB7Ci0JcHJpbnRmKEtFUk5fRVJSICJVc2luZyBhIGNoYW5uZWwgdHlwZSB3aGljaCBpcyBjb25maWd1cmVkIG91dCBvZiAiCisJcHJpbnRrKEtFUk5fRVJSICJVc2luZyBhIGNoYW5uZWwgdHlwZSB3aGljaCBpcyBjb25maWd1cmVkIG91dCBvZiAiCiAJICAgICAgICJVTUxcbiIpOwogCXJldHVybigtRUlPKTsKIH0KIAogc3RhdGljIGludCBub3RfY29uZmlnZ2VkX3dyaXRlKGludCBmZCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuLCB2b2lkICpkYXRhKQogewotCXByaW50ZihLRVJOX0VSUiAiVXNpbmcgYSBjaGFubmVsIHR5cGUgd2hpY2ggaXMgY29uZmlndXJlZCBvdXQgb2YgIgorCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgYSBjaGFubmVsIHR5cGUgd2hpY2ggaXMgY29uZmlndXJlZCBvdXQgb2YgIgogCSAgICAgICAiVU1MXG4iKTsKIAlyZXR1cm4oLUVJTyk7CiB9CkBAIC01OCw3ICs2Niw3IEBACiBzdGF0aWMgaW50IG5vdF9jb25maWdnZWRfY29uc29sZV93cml0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwKIAkJCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKLQlwcmludGYoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKKwlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKIAkgICAgICAgIlVNTFxuIik7CiAJcmV0dXJuKC1FSU8pOwogfQpAQCAtNjYsNyArNzQsNyBAQAogc3RhdGljIGludCBub3RfY29uZmlnZ2VkX3dpbmRvd19zaXplKGludCBmZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgc2hvcnQgKnJvd3MsCiAJCQkJICAgICB1bnNpZ25lZCBzaG9ydCAqY29scykKIHsKLQlwcmludGYoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKKwlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGEgY2hhbm5lbCB0eXBlIHdoaWNoIGlzIGNvbmZpZ3VyZWQgb3V0IG9mICIKIAkgICAgICAgIlVNTFxuIik7CiAJcmV0dXJuKC1FTk9ERVYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMKaW5kZXggZmFmNzE0ZS4uMjE3NDM4YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jCkBAIC03Myw3ICs3Myw2IEBACiAJc3RydWN0IG1jYXN0X2luaXQgKmluaXQgPSBkYXRhOwogCWNoYXIgKnBvcnRfc3RyID0gTlVMTCwgKnR0bF9zdHIgPSBOVUxMLCAqcmVtYWluOwogCWNoYXIgKmxhc3Q7Ci0JaW50IG47CiAKIAkqaW5pdCA9ICgoc3RydWN0IG1jYXN0X2luaXQpCiAJCXsgLmFkZHIgCT0gIjIzOS4xOTIuMTY4LjEiLApAQCAtODksMTMgKzg4LDEyIEBACiAJfQogCQogCWlmKHBvcnRfc3RyICE9IE5VTEwpewotCQluID0gc2ltcGxlX3N0cnRvdWwocG9ydF9zdHIsICZsYXN0LCAxMCk7CisJCWluaXQtPnBvcnQgPSBzaW1wbGVfc3RydG91bChwb3J0X3N0ciwgJmxhc3QsIDEwKTsKIAkJaWYoKCpsYXN0ICE9ICdcMCcpIHx8IChsYXN0ID09IHBvcnRfc3RyKSl7CiAJCQlwcmludGsoS0VSTl9FUlIgIm1jYXN0X3NldHVwIC0gQmFkIHBvcnQgOiAnJXMnXG4iLCAKIAkJCSAgICAgICBwb3J0X3N0cik7CiAJCQlyZXR1cm4oMCk7CiAJCX0KLQkJaW5pdC0+cG9ydCA9IGh0b25zKG4pOwogCX0KIAogCWlmKHR0bF9zdHIgIT0gTlVMTCl7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCAwZmUxZDlmLi43YTBkMTE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAl9CiAJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluX2F0b24oYWRkcik7Ci0Jc2luLT5zaW5fcG9ydCA9IHBvcnQ7CisJc2luLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwogCXJldHVybihzaW4pOwogfQogCkBAIC01NSwyOCArNTUsMjUgQEAKIAlzdHJ1Y3QgbWNhc3RfZGF0YSAqcHJpID0gZGF0YTsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IHByaS0+bWNhc3RfYWRkcjsKIAlzdHJ1Y3QgaXBfbXJlcSBtcmVxOwotCWludCBmZCwgeWVzID0gMTsKKwlpbnQgZmQgPSAtRUlOVkFMLCB5ZXMgPSAxLCBlcnIgPSAtRUlOVkFMOzsKIAogCi0JaWYgKChzaW4tPnNpbl9hZGRyLnNfYWRkciA9PSAwKSB8fCAoc2luLT5zaW5fcG9ydCA9PSAwKSkgewotCQlmZCA9IC1FSU5WQUw7CisJaWYgKChzaW4tPnNpbl9hZGRyLnNfYWRkciA9PSAwKSB8fCAoc2luLT5zaW5fcG9ydCA9PSAwKSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKIAlpZiAoZmQgPCAwKXsKIAkJcHJpbnRrKCJtY2FzdF9vcGVuIDogZGF0YSBzb2NrZXQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCAKIAkJICAgICAgIGVycm5vKTsKLQkJZmQgPSAtRU5PTUVNOworCQlmZCA9IC1lcnJubzsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpIDwgMCkgewogCQlwcmludGsoIm1jYXN0X29wZW46IFNPX1JFVVNFQUREUiBmYWlsZWQsIGVycm5vID0gJWRcbiIsCiAJCQllcnJubyk7Ci0JCW9zX2Nsb3NlX2ZpbGUoZmQpOwotCQlmZCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKIAkvKiBzZXQgdHRsIGFjY29yZGluZyB0byBjb25maWcgKi8KQEAgLTg0LDI2ICs4MSwyMCBAQAogCQkgICAgICAgc2l6ZW9mKHByaS0+dHRsKSkgPCAwKSB7CiAJCXByaW50aygibWNhc3Rfb3BlbjogSVBfTVVMVElDQVNUX1RUTCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCiAJCQllcnJubyk7Ci0JCW9zX2Nsb3NlX2ZpbGUoZmQpOwotCQlmZCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKIAkvKiBzZXQgTE9PUCwgc28gZGF0YSBkb2VzIGdldCBmZWQgYmFjayB0byBsb2NhbCBzb2NrZXRzICovCiAJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9JUCwgSVBfTVVMVElDQVNUX0xPT1AsICZ5ZXMsIHNpemVvZih5ZXMpKSA8IDApIHsKIAkJcHJpbnRrKCJtY2FzdF9vcGVuOiBJUF9NVUxUSUNBU1RfTE9PUCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCiAJCQllcnJubyk7Ci0JCW9zX2Nsb3NlX2ZpbGUoZmQpOwotCQlmZCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKIAkvKiBiaW5kIHNvY2tldCB0byBtY2FzdCBhZGRyZXNzICovCiAJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luLCBzaXplb2YoKnNpbikpIDwgMCkgewogCQlwcmludGsoIm1jYXN0X29wZW4gOiBkYXRhIGJpbmQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7Ci0JCW9zX2Nsb3NlX2ZpbGUoZmQpOwotCQlmZCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jbG9zZTsKIAl9CQkKIAkKIAkvKiBzdWJzY3JpYmUgdG8gdGhlIG11bHRpY2FzdCBncm91cCAqLwpAQCAtMTE3LDEyICsxMDgsMTUgQEAKIAkJICAgICAgICJpbnRlcmZhY2Ugb24gdGhlIGhvc3QuXG4iKTsKIAkJcHJpbnRrKCJldGgwIHNob3VsZCBiZSBjb25maWd1cmVkIGluIG9yZGVyIHRvIHVzZSB0aGUgIgogCQkgICAgICAgIm11bHRpY2FzdCB0cmFuc3BvcnQuXG4iKTsKLQkJb3NfY2xvc2VfZmlsZShmZCk7Ci0JCWZkID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dF9jbG9zZTsKIAl9CiAKICBvdXQ6Ci0JcmV0dXJuKGZkKTsKKwlyZXR1cm4gZmQ7CisKKyBvdXRfY2xvc2U6CisgICAgICAgIG9zX2Nsb3NlX2ZpbGUoZmQpOworICAgICAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtY2FzdF9jbG9zZShpbnQgZmQsIHZvaWQgKmRhdGEpCkBAIC0xNjQsMTQgKzE1OCwzIEBACiAJLmRlbGV0ZV9hZGRyZXNzID0gTlVMTCwKIAkubWF4X3BhY2tldAk9IE1BWF9QQUNLRVQgLSBFVEhfSEVBREVSX09USEVSCiB9OwotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCA5YTU2ZmY5Li44OGY5NTZjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgIm1lbV9rZXJuLmgiCiAjaW5jbHVkZSAiY293LmgiCiAKLWVudW0gdWJkX3JlcSB7IFVCRF9SRUFELCBVQkRfV1JJVEUsIFVCRF9NTUFQIH07CitlbnVtIHViZF9yZXEgeyBVQkRfUkVBRCwgVUJEX1dSSVRFIH07CiAKIHN0cnVjdCBpb190aHJlYWRfcmVxIHsKIAllbnVtIHViZF9yZXEgb3A7CkBAIC02OCw4ICs2OCw2IEBACiAJdW5zaWduZWQgbG9uZyBzZWN0b3JfbWFzazsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY293X29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGJpdG1hcF93b3Jkc1syXTsKLQlpbnQgbWFwX2ZkOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXBfb2Zmc2V0OwogCWludCBlcnJvcjsKIH07CiAKQEAgLTEyMiwxMCArMTIwLDYgQEAKIAogI2RlZmluZSBNQVhfREVWICg4KQogCi0vKiBDaGFuZ2VkIGluIGVhcmx5IGJvb3QgKi8KLXN0YXRpYyBpbnQgdWJkX2RvX21tYXAgPSAwOwotI2RlZmluZSBVQkRfTU1BUF9CTE9DS19TSVpFIFBBR0VfU0laRQotCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHViZF9ibG9wcyA9IHsKICAgICAgICAgLm93bmVyCQk9IFRISVNfTU9EVUxFLAogICAgICAgICAub3BlbgkJPSB1YmRfb3BlbiwKQEAgLTE3NSwxMiArMTY5LDYgQEAKIAlpbnQgbm9fY293OwogCXN0cnVjdCBjb3cgY293OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGRldjsKLQotCWludCBtYXBfd3JpdGVzOwotCWludCBtYXBfcmVhZHM7Ci0JaW50IG5vbWFwX3dyaXRlczsKLQlpbnQgbm9tYXBfcmVhZHM7Ci0JaW50IHdyaXRlX21hcHM7CiB9OwogCiAjZGVmaW5lIERFRkFVTFRfQ09XIHsgXApAQCAtMjAwLDExICsxODgsNiBAQAogCS5vcGVuZmxhZ3MgPQkJT1BFTl9GTEFHUywgXAogICAgICAgICAubm9fY293ID0gICAgICAgICAgICAgICAwLCBcCiAgICAgICAgIC5jb3cgPQkJCURFRkFVTFRfQ09XLCBcCi0JLm1hcF93cml0ZXMJCT0gMCwgXAotCS5tYXBfcmVhZHMJCT0gMCwgXAotCS5ub21hcF93cml0ZXMJCT0gMCwgXAotCS5ub21hcF9yZWFkcwkJPSAwLCBcCi0JLndyaXRlX21hcHMJCT0gMCwgXAogfQogCiBzdHJ1Y3QgdWJkIHViZF9kZXZbTUFYX0RFVl0gPSB7IFsgMCAuLi4gTUFYX0RFViAtIDEgXSA9IERFRkFVTFRfVUJEIH07CkBAIC0zMTQsMTMgKzI5Nyw2IEBACiAJCWludCBtYWpvcjsKIAogCQlzdHIrKzsKLQkJaWYoIXN0cmNtcChzdHIsICJtbWFwIikpewotCQkJQ0hPT1NFX01PREUocHJpbnRrKCJtbWFwIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHViZCAiCi0JCQkJCSAgICJkcml2ZXIgaW4gdHQgbW9kZVxuIiksCi0JCQkJICAgIHViZF9kb19tbWFwID0gMSk7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQogCQlpZighc3RyY21wKHN0ciwgInN5bmMiKSl7CiAJCQlnbG9iYWxfb3BlbmZsYWdzID0gb2Zfc3luYyhnbG9iYWxfb3BlbmZsYWdzKTsKIAkJCXJldHVybigwKTsKQEAgLTUyNCw3ICs1MDAsNyBAQAogewogCXN0cnVjdCBpb190aHJlYWRfcmVxIHJlcTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHViZF9xdWV1ZSk7Ci0JaW50IG4sIGVycjsKKwlpbnQgbjsKIAogCWRvX3ViZCA9IE5VTEw7CiAJaW50cl9jb3VudCsrOwpAQCAtNTM4LDE5ICs1MTQsNiBAQAogCQlyZXR1cm47CiAJfQogICAgICAgICAKLQlpZigocmVxLm9wICE9IFVCRF9NTUFQKSAmJgotCSAgICgocmVxLm9mZnNldCAhPSAoKF9fdTY0KSAocnEtPnNlY3RvcikpIDw8IDkpIHx8Ci0JICAgIChyZXEubGVuZ3RoICE9IChycS0+Y3VycmVudF9ucl9zZWN0b3JzKSA8PCA5KSkpCi0JCXBhbmljKCJJL08gb3AgbWlzbWF0Y2giKTsKLQkKLQlpZihyZXEubWFwX2ZkICE9IC0xKXsKLQkJZXJyID0gcGh5c21lbV9zdWJzdF9tYXBwaW5nKHJlcS5idWZmZXIsIHJlcS5tYXBfZmQsCi0JCQkJCSAgICByZXEubWFwX29mZnNldCwgMSk7Ci0JCWlmKGVycikKLQkJCXByaW50aygidWJkX2hhbmRsZXIgLSBwaHlzbWVtX3N1YnN0X21hcHBpbmcgZmFpbGVkLCAiCi0JCQkgICAgICAgImVyciA9ICVkXG4iLCAtZXJyKTsKLQl9Ci0KIAl1YmRfZmluaXNoKHJxLCByZXEuZXJyb3IpOwogCXJlYWN0aXZhdGVfZmQodGhyZWFkX2ZkLCBVQkRfSVJRKTsJCiAJZG9fdWJkX3JlcXVlc3QodWJkX3F1ZXVlKTsKQEAgLTU4MywxNCArNTQ2LDEwIEBACiAKIHN0YXRpYyB2b2lkIHViZF9jbG9zZShzdHJ1Y3QgdWJkICpkZXYpCiB7Ci0JaWYodWJkX2RvX21tYXApCi0JCXBoeXNtZW1fZm9yZ2V0X2Rlc2NyaXB0b3IoZGV2LT5mZCk7CiAJb3NfY2xvc2VfZmlsZShkZXYtPmZkKTsKIAlpZihkZXYtPmNvdy5maWxlID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmKHViZF9kb19tbWFwKQotCQlwaHlzbWVtX2ZvcmdldF9kZXNjcmlwdG9yKGRldi0+Y293LmZkKTsKIAlvc19jbG9zZV9maWxlKGRldi0+Y293LmZkKTsKIAl2ZnJlZShkZXYtPmNvdy5iaXRtYXApOwogCWRldi0+Y293LmJpdG1hcCA9IE5VTEw7CkBAIC0xMDEwLDk0ICs5NjksMTMgQEAKIAkJCSAgIHJlcS0+Yml0bWFwX3dvcmRzLCBiaXRtYXBfbGVuKTsKIH0KIAotc3RhdGljIGludCBtbWFwX2ZkKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCB1YmQgKmRldiwgX191NjQgb2Zmc2V0KQotewotCV9fdTY0IHNlY3RvcjsKLQl1bnNpZ25lZCBjaGFyICpiaXRtYXA7Ci0JaW50IGJpdCwgaTsKLQotCS8qIG1tYXAgbXVzdCBoYXZlIGJlZW4gcmVxdWVzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KLQlpZighdWJkX2RvX21tYXApCi0JCXJldHVybigtMSk7Ci0KLQkvKiBUaGUgYnVmZmVyIG11c3QgYmUgcGFnZSBhbGlnbmVkICovCi0JaWYoKCh1bnNpZ25lZCBsb25nKSByZXEtPmJ1ZmZlciAlIFVCRF9NTUFQX0JMT0NLX1NJWkUpICE9IDApCi0JCXJldHVybigtMSk7Ci0KLQkvKiBUaGUgcmVxdWVzdCBtdXN0IGJlIGEgcGFnZSBsb25nICovCi0JaWYoKHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDkpICE9IFBBR0VfU0laRSkKLQkJcmV0dXJuKC0xKTsKLQotCWlmKGRldi0+Y293LmZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuKGRldi0+ZmQpOwotCi0Jc2VjdG9yID0gb2Zmc2V0ID4+IDk7Ci0JYml0bWFwID0gKHVuc2lnbmVkIGNoYXIgKikgZGV2LT5jb3cuYml0bWFwOwotCWJpdCA9IHViZF90ZXN0X2JpdChzZWN0b3IsIGJpdG1hcCk7Ci0KLQlmb3IoaSA9IDE7IGkgPCByZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsgaSsrKXsKLQkJaWYodWJkX3Rlc3RfYml0KHNlY3RvciArIGksIGJpdG1hcCkgIT0gYml0KQotCQkJcmV0dXJuKC0xKTsKLQl9Ci0KLQlpZihiaXQgfHwgKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpKQotCQlvZmZzZXQgKz0gZGV2LT5jb3cuZGF0YV9vZmZzZXQ7Ci0KLQkvKiBUaGUgZGF0YSBvbiBkaXNrIG11c3QgYmUgcGFnZSBhbGlnbmVkICovCi0JaWYoKG9mZnNldCAlIFVCRF9NTUFQX0JMT0NLX1NJWkUpICE9IDApCi0JCXJldHVybigtMSk7Ci0KLQlyZXR1cm4oYml0ID8gZGV2LT5mZCA6IGRldi0+Y293LmZkKTsKLX0KLQotc3RhdGljIGludCBwcmVwYXJlX21tYXBfcmVxdWVzdChzdHJ1Y3QgdWJkICpkZXYsIGludCBmZCwgX191NjQgb2Zmc2V0LAotCQkJCXN0cnVjdCByZXF1ZXN0ICpyZXEsCi0JCQkJc3RydWN0IGlvX3RocmVhZF9yZXEgKmlvX3JlcSkKLXsKLQlpbnQgZXJyOwotCi0JaWYocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSl7Ci0JCS8qIFdyaXRlcyBhcmUgYWxtb3N0IG5vLW9wcyBzaW5jZSB0aGUgbmV3IGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUKLQkJICogaG9zdCBwYWdlIGNhY2hlCi0JCSAqLwotCQlkZXYtPm1hcF93cml0ZXMrKzsKLQkJaWYoZGV2LT5jb3cuZmlsZSAhPSBOVUxMKQotCQkJY293aWZ5X2JpdG1hcChpb19yZXEtPm9mZnNldCwgaW9fcmVxLT5sZW5ndGgsCi0JCQkJICAgICAgJmlvX3JlcS0+c2VjdG9yX21hc2ssICZpb19yZXEtPmNvd19vZmZzZXQsCi0JCQkJICAgICAgZGV2LT5jb3cuYml0bWFwLCBkZXYtPmNvdy5iaXRtYXBfb2Zmc2V0LAotCQkJCSAgICAgIGlvX3JlcS0+Yml0bWFwX3dvcmRzLAotCQkJCSAgICAgIGRldi0+Y293LmJpdG1hcF9sZW4pOwotCX0KLQllbHNlIHsKLQkJaW50IHc7Ci0KLQkJaWYoKGRldi0+Y293LmZpbGUgIT0gTlVMTCkgJiYgKGZkID09IGRldi0+Y293LmZkKSkKLQkJCXcgPSAwOwotCQllbHNlIHcgPSBkZXYtPm9wZW5mbGFncy53OwotCi0JCWlmKChkZXYtPmNvdy5maWxlICE9IE5VTEwpICYmIChmZCA9PSBkZXYtPmZkKSkKLQkJCW9mZnNldCArPSBkZXYtPmNvdy5kYXRhX29mZnNldDsKLQotCQllcnIgPSBwaHlzbWVtX3N1YnN0X21hcHBpbmcocmVxLT5idWZmZXIsIGZkLCBvZmZzZXQsIHcpOwotCQlpZihlcnIpewotCQkJcHJpbnRrKCJwaHlzbWVtX3N1YnN0X21hcHBpbmcgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCSAgICAgICAtZXJyKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlkZXYtPm1hcF9yZWFkcysrOwotCX0KLQlpb19yZXEtPm9wID0gVUJEX01NQVA7Ci0JaW9fcmVxLT5idWZmZXIgPSByZXEtPmJ1ZmZlcjsKLQlyZXR1cm4oMCk7Ci19Ci0KIC8qIENhbGxlZCB3aXRoIHViZF9pb19sb2NrIGhlbGQgKi8KIHN0YXRpYyBpbnQgcHJlcGFyZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBpb190aHJlYWRfcmVxICppb19yZXEpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZXEtPnJxX2Rpc2s7CiAJc3RydWN0IHViZCAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCV9fdTY0IG9mZnNldDsKLQlpbnQgbGVuLCBmZDsKKwlpbnQgbGVuOwogCiAJaWYocmVxLT5ycV9zdGF0dXMgPT0gUlFfSU5BQ1RJVkUpIHJldHVybigxKTsKIApAQCAtMTExNCwzNCArOTkyLDEyIEBACiAKIAlpb19yZXEtPmZkc1swXSA9IChkZXYtPmNvdy5maWxlICE9IE5VTEwpID8gZGV2LT5jb3cuZmQgOiBkZXYtPmZkOwogCWlvX3JlcS0+ZmRzWzFdID0gZGV2LT5mZDsKLQlpb19yZXEtPm1hcF9mZCA9IC0xOwogCWlvX3JlcS0+Y293X29mZnNldCA9IC0xOwogCWlvX3JlcS0+b2Zmc2V0ID0gb2Zmc2V0OwogCWlvX3JlcS0+bGVuZ3RoID0gbGVuOwogCWlvX3JlcS0+ZXJyb3IgPSAwOwogCWlvX3JlcS0+c2VjdG9yX21hc2sgPSAwOwogCi0JZmQgPSBtbWFwX2ZkKHJlcSwgZGV2LCBpb19yZXEtPm9mZnNldCk7Ci0JaWYoZmQgPiAwKXsKLQkJLyogSWYgbW1hcHBpbmcgaXMgb3RoZXJ3aXNlIE9LLCBidXQgdGhlIGZpcnN0IGFjY2VzcyB0byB0aGUKLQkJICogcGFnZSBpcyBhIHdyaXRlLCB0aGVuIGl0J3Mgbm90IG1hcHBlZCBpbiB5ZXQuICBTbyB3ZSBoYXZlCi0JCSAqIHRvIHdyaXRlIHRoZSBkYXRhIHRvIGRpc2sgZmlyc3QsIHRoZW4gd2UgY2FuIG1hcCB0aGUgZGlzawotCQkgKiBwYWdlIGluIGFuZCBjb250aW51ZSBub3JtYWxseSBmcm9tIHRoZXJlLgotCQkgKi8KLQkJaWYoKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpICYmICFpc19yZW1hcHBlZChyZXEtPmJ1ZmZlcikpewotCQkJaW9fcmVxLT5tYXBfZmQgPSBkZXYtPmZkOwotCQkJaW9fcmVxLT5tYXBfb2Zmc2V0ID0gaW9fcmVxLT5vZmZzZXQgKwotCQkJCWRldi0+Y293LmRhdGFfb2Zmc2V0OwotCQkJZGV2LT53cml0ZV9tYXBzKys7Ci0JCX0KLQkJZWxzZSByZXR1cm4ocHJlcGFyZV9tbWFwX3JlcXVlc3QoZGV2LCBmZCwgaW9fcmVxLT5vZmZzZXQsIHJlcSwKLQkJCQkJCSBpb19yZXEpKTsKLQl9Ci0KLQlpZihycV9kYXRhX2RpcihyZXEpID09IFJFQUQpCi0JCWRldi0+bm9tYXBfcmVhZHMrKzsKLQllbHNlIGRldi0+bm9tYXBfd3JpdGVzKys7Ci0KIAlpb19yZXEtPm9wID0gKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgPyBVQkRfUkVBRCA6IFVCRF9XUklURTsKIAlpb19yZXEtPm9mZnNldHNbMF0gPSAwOwogCWlvX3JlcS0+b2Zmc2V0c1sxXSA9IGRldi0+Y293LmRhdGFfb2Zmc2V0OwpAQCAtMTIyOSwxNDMgKzEwODUsNiBAQAogCXJldHVybigtRUlOVkFMKTsKIH0KIAotc3RhdGljIGludCB1YmRfY2hlY2tfcmVtYXBwZWQoaW50IGZkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBpc193cml0ZSwKLQkJCSAgICAgIF9fdTY0IG9mZnNldCkKLXsKLQlfX3U2NCBiaXRtYXBfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbmV3X2JpdG1hcFsyXTsKLQlpbnQgaSwgZXJyLCBuOwotCi0JLyogSWYgaXQncyBub3QgYSB3cml0ZSBhY2Nlc3MsIHdlIGNhbid0IGRvIGFueXRoaW5nIGFib3V0IGl0ICovCi0JaWYoIWlzX3dyaXRlKQotCQlyZXR1cm4oMCk7Ci0KLQkvKiBXZSBoYXZlIGEgd3JpdGUgKi8KLQlmb3IoaSA9IDA7IGkgPCBzaXplb2YodWJkX2RldikgLyBzaXplb2YodWJkX2RldlswXSk7IGkrKyl7Ci0JCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2W2ldOwotCi0JCWlmKChkZXYtPmZkICE9IGZkKSAmJiAoZGV2LT5jb3cuZmQgIT0gZmQpKQotCQkJY29udGludWU7Ci0KLQkJLyogSXQncyBhIHdyaXRlIHRvIGEgdWJkIGRldmljZSAqLwotCi0JCS8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgbm93ICovCi0JCWlmKCFkZXYtPm9wZW5mbGFncy53KXsKLQkJCS8qIEl0J3MgYSB3cml0ZSBhY2Nlc3Mgb24gYSByZWFkLW9ubHkgZGV2aWNlIC0gcHJvYmFibHkKLQkJCSAqIHNob3VsZG4ndCBoYXBwZW4uICBJZiB0aGUga2VybmVsIGlzIHRyeWluZyB0byBjaGFuZ2UKLQkJCSAqIHNvbWV0aGluZyB3aXRoIG5vIGludGVudGlvbiBvZiB3cml0aW5nIGl0IGJhY2sgb3V0LAotCQkJICogdGhlbiB0aGlzIG1lc3NhZ2Ugd2lsbCBjbHVlIHVzIGluIHRoYXQgdGhpcyBuZWVkcwotCQkJICogZml4aW5nCi0JCQkgKi8KLQkJCXByaW50aygiV3JpdGUgYWNjZXNzIHRvIG1hcHBlZCBwYWdlIGZyb20gcmVhZG9ubHkgdWJkICIKLQkJCSAgICAgICAiZGV2aWNlICVkXG4iLCBpKTsKLQkJCXJldHVybigwKTsKLQkJfQotCi0JCS8qIEl0J3MgYSB3cml0ZSB0byBhIHdyaXRlYWJsZSB1YmQgZGV2aWNlIC0gaXQgbXVzdCBiZSBDT1dlZAotCQkgKiBiZWNhdXNlLCBvdGhlcndpc2UsIHRoZSBwYWdlIHdvdWxkIGhhdmUgYmVlbiBtYXBwZWQgaW4KLQkJICogd3JpdGVhYmxlCi0JCSAqLwotCi0JCWlmKCFkZXYtPmNvdy5maWxlKQotCQkJcGFuaWMoIldyaXRlIGZhdWx0IG9uIHdyaXRlYWJsZSBub24tQ09XIHViZCBkZXZpY2UgJWQiLAotCQkJICAgICAgaSk7Ci0KLQkJLyogSXQgc2hvdWxkIGFsc28gYmUgYW4gYWNjZXNzIHRvIHRoZSBiYWNraW5nIGZpbGUgc2luY2UgdGhlCi0JCSAqIENPVyBwYWdlcyBzaG91bGQgYmUgbWFwcGVkIGluIHJlYWQtd3JpdGUKLQkJICovCi0KLQkJaWYoZmQgPT0gZGV2LT5mZCkKLQkJCXBhbmljKCJXcml0ZSBmYXVsdCBvbiBhIGJhY2tpbmcgcGFnZSBvZiB1YmQgIgotCQkJICAgICAgImRldmljZSAlZFxuIiwgaSk7Ci0KLQkJLyogU28sIHdlIGRvIHRoZSB3cml0ZSwgY29weWluZyB0aGUgYmFja2luZyBkYXRhIHRvIHRoZSBDT1cKLQkJICogZmlsZS4uLgotCQkgKi8KLQotCQllcnIgPSBvc19zZWVrX2ZpbGUoZGV2LT5mZCwgb2Zmc2V0ICsgZGV2LT5jb3cuZGF0YV9vZmZzZXQpOwotCQlpZihlcnIgPCAwKQotCQkJcGFuaWMoIkNvdWxkbid0IHNlZWsgdG8gJWxsZCBpbiBDT1cgZmlsZSBvZiB1YmQgIgotCQkJICAgICAgImRldmljZSAlZCwgZXJyID0gJWQiLAotCQkJICAgICAgb2Zmc2V0ICsgZGV2LT5jb3cuZGF0YV9vZmZzZXQsIGksIC1lcnIpOwotCi0JCW4gPSBvc193cml0ZV9maWxlKGRldi0+ZmQsICh2b2lkICopIGFkZHJlc3MsIFBBR0VfU0laRSk7Ci0JCWlmKG4gIT0gUEFHRV9TSVpFKQotCQkJcGFuaWMoIkNvdWxkbid0IGNvcHkgZGF0YSB0byBDT1cgZmlsZSBvZiB1YmQgIgotCQkJICAgICAgImRldmljZSAlZCwgZXJyID0gJWQiLCBpLCAtbik7Ci0KLQkJLyogLi4uIHVwZGF0aW5nIHRoZSBDT1cgYml0bWFwLi4uICovCi0KLQkJY293aWZ5X2JpdG1hcChvZmZzZXQsIFBBR0VfU0laRSwgTlVMTCwgJmJpdG1hcF9vZmZzZXQsCi0JCQkgICAgICBkZXYtPmNvdy5iaXRtYXAsIGRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkgICAgICBuZXdfYml0bWFwLCBkZXYtPmNvdy5iaXRtYXBfbGVuKTsKLQotCQllcnIgPSBvc19zZWVrX2ZpbGUoZGV2LT5mZCwgYml0bWFwX29mZnNldCk7Ci0JCWlmKGVyciA8IDApCi0JCQlwYW5pYygiQ291bGRuJ3Qgc2VlayB0byAlbGxkIGluIENPVyBmaWxlIG9mIHViZCAiCi0JCQkgICAgICAiZGV2aWNlICVkLCBlcnIgPSAlZCIsIGJpdG1hcF9vZmZzZXQsIGksIC1lcnIpOwotCi0JCW4gPSBvc193cml0ZV9maWxlKGRldi0+ZmQsIG5ld19iaXRtYXAsIHNpemVvZihuZXdfYml0bWFwKSk7Ci0JCWlmKG4gIT0gc2l6ZW9mKG5ld19iaXRtYXApKQotCQkJcGFuaWMoIkNvdWxkbid0IHVwZGF0ZSBiaXRtYXAgIG9mIHViZCBkZXZpY2UgJWQsICIKLQkJCSAgICAgICJlcnIgPSAlZCIsIGksIC1uKTsKLQotCQkvKiBNYXliZSB3ZSBjYW4gbWFwIHRoZSBDT1cgcGFnZSBpbiwgYW5kIG1heWJlIHdlIGNhbid0LiAgSWYKLQkJICogaXQgaXMgYSBwcmUtVjMgQ09XIGZpbGUsIHdlIGNhbid0LCBzaW5jZSB0aGUgYWxpZ25tZW50IHdpbGwKLQkJICogYmUgd3JvbmcuICBJZiBpdCBpcyBhIFYzIG9yIGxhdGVyIENPVyBmaWxlIHdoaWNoIGhhcyBiZWVuCi0JCSAqIG1vdmVkIHRvIGEgc3lzdGVtIHdpdGggYSBsYXJnZXIgcGFnZSBzaXplLCB0aGVuIG1heWJlIHdlCi0JCSAqIGNhbid0LCBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IGxvY2F0aW9uIG9mIHRoZSBwYWdlLgotCQkgKi8KLQotCQlvZmZzZXQgKz0gZGV2LT5jb3cuZGF0YV9vZmZzZXQ7Ci0KLQkJLyogUmVtb3ZlIHRoZSByZW1hcHBpbmcsIHB1dHRpbmcgdGhlIG9yaWdpbmFsIGFub255bW91cyBwYWdlCi0JCSAqIGJhY2suICBJZiB0aGUgQ09XIGZpbGUgY2FuIGJlIG1hcHBlZCBpbiwgdGhhdCBpcyBkb25lLgotCQkgKiBPdGhlcndpc2UsIHRoZSBDT1cgcGFnZSBpcyByZWFkIGluLgotCQkgKi8KLQotCQlpZighcGh5c21lbV9yZW1vdmVfbWFwcGluZygodm9pZCAqKSBhZGRyZXNzKSkKLQkJCXBhbmljKCJBZGRyZXNzIDB4JWx4IG5vdCByZW1hcHBlZCBieSB1YmQgZGV2aWNlICVkIiwKLQkJCSAgICAgIGFkZHJlc3MsIGkpOwotCQlpZigob2Zmc2V0ICUgVUJEX01NQVBfQkxPQ0tfU0laRSkgPT0gMCkKLQkJCXBoeXNtZW1fc3Vic3RfbWFwcGluZygodm9pZCAqKSBhZGRyZXNzLCBkZXYtPmZkLAotCQkJCQkgICAgICBvZmZzZXQsIDEpOwotCQllbHNlIHsKLQkJCWVyciA9IG9zX3NlZWtfZmlsZShkZXYtPmZkLCBvZmZzZXQpOwotCQkJaWYoZXJyIDwgMCkKLQkJCQlwYW5pYygiQ291bGRuJ3Qgc2VlayB0byAlbGxkIGluIENPVyBmaWxlIG9mICIKLQkJCQkgICAgICAidWJkIGRldmljZSAlZCwgZXJyID0gJWQiLCBvZmZzZXQsIGksCi0JCQkJICAgICAgLWVycik7Ci0KLQkJCW4gPSBvc19yZWFkX2ZpbGUoZGV2LT5mZCwgKHZvaWQgKikgYWRkcmVzcywgUEFHRV9TSVpFKTsKLQkJCWlmKG4gIT0gUEFHRV9TSVpFKQotCQkJCXBhbmljKCJGYWlsZWQgdG8gcmVhZCBwYWdlIGZyb20gb2Zmc2V0ICVsbHggb2YgIgotCQkJCSAgICAgICJDT1cgZmlsZSBvZiB1YmQgZGV2aWNlICVkLCBlcnIgPSAlZCIsCi0JCQkJICAgICAgb2Zmc2V0LCBpLCAtbik7Ci0JCX0KLQotCQlyZXR1cm4oMSk7Ci0JfQotCi0JLyogSXQncyBub3QgYSB3cml0ZSBvbiBhIHViZCBkZXZpY2UgKi8KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVtYXBwZXIgdWJkX3JlbWFwcGVyID0gewotCS5saXN0CT0gTElTVF9IRUFEX0lOSVQodWJkX3JlbWFwcGVyLmxpc3QpLAotCS5wcm9jCT0gdWJkX2NoZWNrX3JlbWFwcGVkLAotfTsKLQotc3RhdGljIGludCB1YmRfcmVtYXBwZXJfc2V0dXAodm9pZCkKLXsKLQlpZih1YmRfZG9fbW1hcCkKLQkJcmVnaXN0ZXJfcmVtYXBwZXIoJnViZF9yZW1hcHBlcik7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLV9faW5pdGNhbGwodWJkX3JlbWFwcGVyX3NldHVwKTsKLQogc3RhdGljIGludCBzYW1lX2JhY2tpbmdfZmlsZXMoY2hhciAqZnJvbV9jbWRsaW5lLCBjaGFyICpmcm9tX2NvdywgY2hhciAqY293KQogewogCXN0cnVjdCB1bWxfc3RhdCBidWYxLCBidWYyOwpAQCAtMTU2OCwxNSArMTI4Nyw2IEBACiAJaW50IGVycjsKIAlfX3U2NCBvZmY7CiAKLQlpZihyZXEtPm9wID09IFVCRF9NTUFQKXsKLQkJLyogVG91Y2ggdGhlIHBhZ2UgdG8gZm9yY2UgdGhlIGhvc3QgdG8gZG8gYW55IG5lY2Vzc2FyeSBJTyB0bwotCQkgKiBnZXQgaXQgaW50byBtZW1vcnkKLQkJICovCi0JCW4gPSAqKCh2b2xhdGlsZSBpbnQgKikgcmVxLT5idWZmZXIpOwotCQlyZXEtPmVycm9yID0gdXBkYXRlX2JpdG1hcChyZXEpOwotCQlyZXR1cm47Ci0JfQotCiAJbnNlY3RvcnMgPSByZXEtPmxlbmd0aCAvIHJlcS0+c2VjdG9yc2l6ZTsKIAlzdGFydCA9IDA7CiAJZG8gewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3B0cmFjZS5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3B0cmFjZS5oCmluZGV4IDg0ZWM3ZmYuLjZlYWViOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvcHRyYWNlLmgKQEAgLTMxLDcgKzMxLDYgQEAKICNpZmRlZiBVTUxfQ09ORklHX01PREVfU0tBUwogCiAjaW5jbHVkZSAic2thc19wdHJlZ3MuaCIKLSNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCiAKICNkZWZpbmUgUkVHU19JUChyKSAoKHIpW0hPU1RfSVBdKQogI2RlZmluZSBSRUdTX1NQKHIpICgocilbSE9TVF9TUF0pCkBAIC01OSw2ICs1OCw3IEBACiAjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAzMgogI2VuZGlmCiAKKyNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKIAogdW5pb24gdW1sX3B0X3JlZ3MgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvY2hlY2tzdW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2NoZWNrc3VtLmgKaW5kZXggNTcyYzZjMS4uZWE5NzAwNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvY2hlY2tzdW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9jaGVja3N1bS5oCkBAIC05LDggKzksNiBAQAogI2luY2x1ZGUgImxpbnV4L2luNi5oIgogI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkJICAgaW50IHN1bSwgaW50ICplcnJfcHRyKTsKIGV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgdW5zaWduZWQgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdW0pOwogCkBAIC0zMSwxMCArMjksMTUgQEAKIH0KIAogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCSBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVycl9wdHIpCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb20oc3JjLCBkc3QsIGxlbiwgc3VtLCBlcnJfcHRyKTsKKyAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbikpeworICAgICAgICAgICAgICAgICplcnJfcHRyID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKIC8qKgpAQCAtMTM3LDE1ICsxNDAsNiBAQAogICAgICAgICByZXR1cm4gYTsKIH0KIAotI2VuZGlmCitleHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKIAotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaAppbmRleCAzNDhlOGZjLi5iZThhY2Q1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaApAQCAtMTM1LDYgKzEzNSw3IEBACiAJX19DSE9PU0VfTU9ERShTQ19FRkxBR1MoVVBUX1NDKHIpKSwgUkVHU19FRkxBR1MoKHIpLT5za2FzLnJlZ3MpKQogI2RlZmluZSBVUFRfU0MocikgKChyKS0+dHQuc2MpCiAjZGVmaW5lIFVQVF9TWVNDQUxMX05SKHIpIF9fQ0hPT1NFX01PREUoKHIpLT50dC5zeXNjYWxsLCAociktPnNrYXMuc3lzY2FsbCkKKyNkZWZpbmUgVVBUX1NZU0NBTExfUkVUKHIpIFVQVF9SQVgocikKIAogZXh0ZXJuIGludCB1c2VyX2NvbnRleHQodW5zaWduZWQgbG9uZyBzcCk7CiAKQEAgLTE5NiwzMiArMTk3LDMyIEBACiAKIAogI2RlZmluZSBVUFRfU0VUKHJlZ3MsIHJlZywgdmFsKSBcCi0gICAgICAgICh7ICAgICAgdW5zaWduZWQgbG9uZyB2YWw7IFwKKyAgICAgICAgKHsgICAgICB1bnNpZ25lZCBsb25nIF9fdXB0X3ZhbCA9IHZhbDsgXAogICAgICAgICAgICAgICAgIHN3aXRjaChyZWcpeyBcCi0JCWNhc2UgUjg6IFVQVF9SOChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBSOTogVVBUX1I5KHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFIxMDogVVBUX1IxMChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBSMTE6IFVQVF9SMTEocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgUjEyOiBVUFRfUjEyKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFIxMzogVVBUX1IxMyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBSMTQ6IFVQVF9SMTQocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgUjE1OiBVUFRfUjE1KHJlZ3MpID0gdmFsOyBicmVhazsgXAotICAgICAgICAgICAgICAgIGNhc2UgUklQOiBVUFRfSVAocmVncykgPSB2YWw7IGJyZWFrOyBcCi0gICAgICAgICAgICAgICAgY2FzZSBSU1A6IFVQVF9TUChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJBWDogVVBUX1JBWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJCWDogVVBUX1JCWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJDWDogVVBUX1JDWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJEWDogVVBUX1JEWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJTSTogVVBUX1JTSShyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJESTogVVBUX1JESShyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIFJCUDogVVBUX1JCUChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIE9SSUdfUkFYOiBVUFRfT1JJR19SQVgocmVncykgPSB2YWw7IGJyZWFrOyBcCi0gICAgICAgICAgICAgICAgY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotICAgICAgICAgICAgICAgIGNhc2UgRFM6IFVQVF9EUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIEVTOiBVUFRfRVMocmVncykgPSB2YWw7IGJyZWFrOyBcCi0gICAgICAgICAgICAgICAgY2FzZSBGUzogVVBUX0ZTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotICAgICAgICAgICAgICAgIGNhc2UgR1M6IFVQVF9HUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLSAgICAgICAgICAgICAgICBjYXNlIEVGTEFHUzogVVBUX0VGTEFHUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFI4OiBVUFRfUjgocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBSOTogVVBUX1I5KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjEwOiBVUFRfUjEwKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjExOiBVUFRfUjExKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjEyOiBVUFRfUjEyKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjEzOiBVUFRfUjEzKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjE0OiBVUFRfUjE0KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUjE1OiBVUFRfUjE1KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgUklQOiBVUFRfSVAocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBSU1A6IFVQVF9TUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJBWDogVVBUX1JBWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJCWDogVVBUX1JCWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJDWDogVVBUX1JDWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJEWDogVVBUX1JEWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJTSTogVVBUX1JTSShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJESTogVVBUX1JESShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFJCUDogVVBUX1JCUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIE9SSUdfUkFYOiBVUFRfT1JJR19SQVgocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgRFM6IFVQVF9EUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIEVTOiBVUFRfRVMocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBGUzogVVBUX0ZTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgR1M6IFVQVF9HUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIEVGTEFHUzogVVBUX0VGTEFHUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKICAgICAgICAgICAgICAgICBkZWZhdWx0IDogIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gVVBUX1NFVCA6ICVkXG4iLCByZWcpOyAgXAogCQkJYnJlYWs7IFwKQEAgLTI0NSwxNCArMjQ2LDMgQEAKICAgICAgICAgQ0hPT1NFX01PREUoKCYociktPnR0LmZhdWx0aW5mbyksICgmKHIpLT5za2FzLmZhdWx0aW5mbykpCiAKICNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZQppbmRleCA5NzM2Y2EyLi5hODkxOGU4MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAKIAl0bGIubyB0cmFwX2tlcm4ubyB0cmFwX3VzZXIubyB1YWNjZXNzX3VzZXIubyB1bV9hcmNoLm8gdW1pZC5vIFwKIAl1c2VyX3V0aWwubwogCi1vYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICs9IGluaXRyZF9rZXJuLm8gaW5pdHJkX3VzZXIubworb2JqLSQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSArPSBpbml0cmQubwogb2JqLSQoQ09ORklHX0dQUk9GKQkrPSBncHJvZl9zeW1zLm8KIG9iai0kKENPTkZJR19HQ09WKQkrPSBnbW9uX3N5bXMubwogb2JqLSQoQ09ORklHX1RUWV9MT0cpCSs9IHR0eV9sb2cubwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvY2hlY2tzdW0uYyBiL2FyY2gvdW0va2VybmVsL2NoZWNrc3VtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvY2hlY2tzdW0uYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYyBiL2FyY2gvdW0va2VybmVsL2luaXRyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWNmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSAibGludXgvaW5pdC5oIgorI2luY2x1ZGUgImxpbnV4L2Jvb3RtZW0uaCIKKyNpbmNsdWRlICJsaW51eC9pbml0cmQuaCIKKyNpbmNsdWRlICJhc20vdHlwZXMuaCIKKyNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJpbml0cmQuaCIKKyNpbmNsdWRlICJpbml0LmgiCisjaW5jbHVkZSAib3MuaCIKKworLyogQ2hhbmdlZCBieSB1bWxfaW5pdHJkX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCitzdGF0aWMgY2hhciAqaW5pdHJkIF9faW5pdGRhdGEgPSBOVUxMOworCitzdGF0aWMgaW50IF9faW5pdCByZWFkX2luaXRyZCh2b2lkKQoreworCXZvaWQgKmFyZWE7CisJbG9uZyBsb25nIHNpemU7CisJaW50IGVycjsKKworCWlmKGluaXRyZCA9PSBOVUxMKSByZXR1cm4gMDsKKwllcnIgPSBvc19maWxlX3NpemUoaW5pdHJkLCAmc2l6ZSk7CisJaWYoZXJyKSByZXR1cm4gMDsKKwlhcmVhID0gYWxsb2NfYm9vdG1lbShzaXplKTsKKwlpZihhcmVhID09IE5VTEwpIHJldHVybiAwOworCWlmKGxvYWRfaW5pdHJkKGluaXRyZCwgYXJlYSwgc2l6ZSkgPT0gLTEpIHJldHVybiAwOworCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBhcmVhOworCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBzaXplOworCXJldHVybiAwOworfQorCitfX3VtbF9wb3N0c2V0dXAocmVhZF9pbml0cmQpOworCitzdGF0aWMgaW50IF9faW5pdCB1bWxfaW5pdHJkX3NldHVwKGNoYXIgKmxpbmUsIGludCAqYWRkKQoreworCWluaXRyZCA9IGxpbmU7CisJcmV0dXJuIDA7Cit9CisKK19fdW1sX3NldHVwKCJpbml0cmQ9IiwgdW1sX2luaXRyZF9zZXR1cCwKKyJpbml0cmQ9PGluaXRyZCBpbWFnZT5cbiIKKyIgICAgVGhpcyBpcyB1c2VkIHRvIGJvb3QgVU1MIGZyb20gYW4gaW5pdHJkIGltYWdlLiAgVGhlIGFyZ3VtZW50IGlzIHRoZVxuIgorIiAgICBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGltYWdlLlxuXG4iCispOworCitpbnQgbG9hZF9pbml0cmQoY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGZkLCBuOworCisJZmQgPSBvc19vcGVuX2ZpbGUoZmlsZW5hbWUsIG9mX3JlYWQoT1BFTkZMQUdTKCkpLCAwKTsKKwlpZihmZCA8IDApeworCQlwcmludGsoIk9wZW5pbmcgJyVzJyBmYWlsZWQgLSBlcnIgPSAlZFxuIiwgZmlsZW5hbWUsIC1mZCk7CisJCXJldHVybigtMSk7CisJfQorCW4gPSBvc19yZWFkX2ZpbGUoZmQsIGJ1Ziwgc2l6ZSk7CisJaWYobiAhPSBzaXplKXsKKwkJcHJpbnRrKCJSZWFkIG9mICVkIGJ5dGVzIGZyb20gJyVzJyBmYWlsZWQsIGVyciA9ICVkXG4iLCBzaXplLAorCQkgICAgICAgZmlsZW5hbWUsIC1uKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlvc19jbG9zZV9maWxlKGZkKTsKKwlyZXR1cm4oMCk7Cit9CisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxX3VzZXIuYyBiL2FyY2gvdW0va2VybmVsL2lycV91c2VyLmMKaW5kZXggNmQ2Zjk0OC4uYjMwNzRjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvaXJxX3VzZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnFfdXNlci5jCkBAIC0yMzYsOSArMjM2LDE1IEBACiAJCQkJICAgICAgICgqcHJldiktPmZkLCBwb2xsZmRzW2ldLmZkKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCW1lbWNweSgmcG9sbGZkc1tpXSwgJnBvbGxmZHNbaSArIDFdLAotCQkJICAgICAgIChwb2xsZmRzX251bSAtIGkgLSAxKSAqIHNpemVvZihwb2xsZmRzWzBdKSk7CisKIAkJCXBvbGxmZHNfbnVtLS07CisKKwkJCS8qIFRoaXMgbW92ZXMgdGhlICp3aG9sZSogYXJyYXkgYWZ0ZXIgcG9sbGZkc1tpXSAodGhvdWdoCisJCQkgKiBpdCBkb2Vzbid0IHNwb3QgYXMgc3VjaCkhICovCisKKwkJCW1lbW1vdmUoJnBvbGxmZHNbaV0sICZwb2xsZmRzW2kgKyAxXSwKKwkJCSAgICAgICAocG9sbGZkc19udW0gLSBpKSAqIHNpemVvZihwb2xsZmRzWzBdKSk7CisKIAkJCWlmKGxhc3RfaXJxX3B0ciA9PSAmb2xkX2ZkLT5uZXh0KSAKIAkJCQlsYXN0X2lycV9wdHIgPSBwcmV2OwogCQkJKnByZXYgPSAoKnByZXYpLT5uZXh0OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKaW5kZXggNzhkNjlkYy4uOTk0MzlmYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCkBAIC01Nyw2ICs1Nyw3IEBACiBFWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyX3NrYXMpOwogRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfc2thcyk7CiBFWFBPUlRfU1lNQk9MKGNvcHlfZnJvbV91c2VyX3NrYXMpOworRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyX3NrYXMpOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKHVtbF9zdHJkdXApOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tZW0uYyBiL2FyY2gvdW0va2VybmVsL21lbS5jCmluZGV4IGYxNTY2NjEuLmMyMjgyNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL21lbS5jCkBAIC0xMDAsMTIgKzEwMCwzNyBAQAogI2VuZGlmCiB9CiAKKy8qCisgKiBDcmVhdGUgYSBwYWdlIHRhYmxlIGFuZCBwbGFjZSBhIHBvaW50ZXIgdG8gaXQgaW4gYSBtaWRkbGUgcGFnZQorICogZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgb25lX3BhZ2VfdGFibGVfaW5pdChwbWRfdCAqcG1kKQoreworCWlmIChwbWRfbm9uZSgqcG1kKSkgeworCQlwdGVfdCAqcHRlID0gKHB0ZV90ICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJCXNldF9wbWQocG1kLCBfX3BtZChfS0VSTlBHX1RBQkxFICsKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcpIF9fcGEocHRlKSkpOworCQlpZiAocHRlICE9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkpCisJCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbmVfbWRfdGFibGVfaW5pdChwdWRfdCAqcHVkKQoreworI2lmZGVmIENPTkZJR18zX0xFVkVMX1BHVEFCTEVTCisJcG1kX3QgKnBtZF90YWJsZSA9IChwbWRfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCXNldF9wdWQocHVkLCBfX3B1ZChfS0VSTlBHX1RBQkxFICsgKHVuc2lnbmVkIGxvbmcpIF9fcGEocG1kX3RhYmxlKSkpOworCWlmIChwbWRfdGFibGUgIT0gcG1kX29mZnNldChwdWQsIDApKQorCQlCVUcoKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgZml4cmFuZ2VfaW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgCiAJCQkJIHBnZF90ICpwZ2RfYmFzZSkKIHsKIAlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CiAJcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwogCWludCBpLCBqOwogCXVuc2lnbmVkIGxvbmcgdmFkZHI7CiAKQEAgLTExNSwxNSArMTQwLDEyIEBACiAJcGdkID0gcGdkX2Jhc2UgKyBpOwogCiAJZm9yICggOyAoaSA8IFBUUlNfUEVSX1BHRCkgJiYgKHZhZGRyIDwgZW5kKTsgcGdkKyssIGkrKykgewotCQlwbWQgPSAocG1kX3QgKilwZ2Q7CisJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7CisJCWlmIChwdWRfbm9uZSgqcHVkKSkKKwkJCW9uZV9tZF90YWJsZV9pbml0KHB1ZCk7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YWRkcik7CiAJCWZvciAoOyAoaiA8IFBUUlNfUEVSX1BNRCkgJiYgKHZhZGRyICE9IGVuZCk7IHBtZCsrLCBqKyspIHsKLQkJCWlmIChwbWRfbm9uZSgqcG1kKSkgewotCQkJCXB0ZSA9IChwdGVfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOwotCQkJCXNldF9wbWQocG1kLCBfX3BtZChfS0VSTlBHX1RBQkxFICsgCi0JCQkJCQkgICAodW5zaWduZWQgbG9uZykgX19wYShwdGUpKSk7Ci0JCQkJaWYgKHB0ZSAhPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIDApKQotCQkJCQlCVUcoKTsKLQkJCX0KKwkJCW9uZV9wYWdlX3RhYmxlX2luaXQocG1kKTsKIAkJCXZhZGRyICs9IFBNRF9TSVpFOwogCQl9CiAJCWogPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYwppbmRleCAyYjc1ZDhkLi4yOTI1ZTE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYwpAQCAtMjgsOSArMjgsOSBAQAogICAgICAgICBjaGlsZC0+dGhyZWFkLnNpbmdsZXN0ZXBfc3lzY2FsbCA9IDA7CiAKICNpZmRlZiBTVUJBUkNIX1NFVF9TSU5HTEVTVEVQUElORwotICAgICAgICBTVUJBUkNIX1NFVF9TSU5HTEVTVEVQUElORyhjaGlsZCwgb24pCisgICAgICAgIFNVQkFSQ0hfU0VUX1NJTkdMRVNURVBQSU5HKGNoaWxkLCBvbik7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICB9Cit9CiAKIC8qCiAgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KQEAgLTgzLDcgKzgzLDcgQEAKIAl9CiAKICNpZmRlZiBTVUJBQ0hfUFRSQUNFX1NQRUNJQUwKLSAgICAgICAgU1VCQVJDSF9QVFJBQ0VfU1BFQ0lBTChjaGlsZCxyZXF1ZXN0LGFkZHIsZGF0YSkKKyAgICAgICAgU1VCQVJDSF9QVFJBQ0VfU1BFQ0lBTChjaGlsZCxyZXF1ZXN0LGFkZHIsZGF0YSk7CiAjZW5kaWYKIAogCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYwppbmRleCA1ZmNhMmM2Li4xZGUyMmQ4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYwpAQCAtNTcsMTAgKzU3LDExIEBACiAJKmNvZGVfb3V0ID0gU0VHVl9BQ0NFUlI7CiAJaWYoaXNfd3JpdGUgJiYgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSAKIAkJZ290byBvdXQ7CisKKyAgICAgICAgaWYoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKIAlwYWdlID0gYWRkcmVzcyAmIFBBR0VfTUFTSzsKLQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBwYWdlKTsKLQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgcGFnZSk7Ci0JcG1kID0gcG1kX29mZnNldChwdWQsIHBhZ2UpOwogCWRvIHsKICBzdXJ2aXZlOgogCQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc193cml0ZSkpewpAQCAtMTA2LDMzICsxMDcsNiBAQAogCWdvdG8gb3V0OwogfQogCi1MSVNUX0hFQUQocGh5c21lbV9yZW1hcHBlcnMpOwotCi12b2lkIHJlZ2lzdGVyX3JlbWFwcGVyKHN0cnVjdCByZW1hcHBlciAqaW5mbykKLXsKLQlsaXN0X2FkZCgmaW5mby0+bGlzdCwgJnBoeXNtZW1fcmVtYXBwZXJzKTsKLX0KLQotc3RhdGljIGludCBjaGVja19yZW1hcHBlZF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IGlzX3dyaXRlKQotewotCXN0cnVjdCByZW1hcHBlciAqcmVtYXBwZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlOwotCV9fdTY0IG9mZnNldDsKLQlpbnQgZmQ7Ci0KLQlmZCA9IHBoeXNfbWFwcGluZyhfX3BhKGFkZHJlc3MpLCAmb2Zmc2V0KTsKLQlpZihmZCA9PSAtMSkKLQkJcmV0dXJuKDApOwotCi0JbGlzdF9mb3JfZWFjaChlbGUsICZwaHlzbWVtX3JlbWFwcGVycyl7Ci0JCXJlbWFwcGVyID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCByZW1hcHBlciwgbGlzdCk7Ci0JCWlmKCgqcmVtYXBwZXItPnByb2MpKGZkLCBhZGRyZXNzLCBpc193cml0ZSwgb2Zmc2V0KSkKLQkJCXJldHVybigxKTsKLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KIC8qCiAgKiBXZSBnaXZlIGEgKmNvcHkqIG9mIHRoZSBmYXVsdGluZm8gaW4gdGhlIHJlZ3MgdG8gc2Vndi4KICAqIFRoaXMgbXVzdCBiZSBkb25lLCBzaW5jZSBuZXN0aW5nIFNFR1ZzIGNvdWxkIG92ZXJ3cml0ZQpAQCAtMTUxLDggKzEyNSw2IEBACiAgICAgICAgICAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF92bSgpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKICAgICAgICAgfQotCWVsc2UgaWYoY2hlY2tfcmVtYXBwZWRfYWRkcihhZGRyZXNzICYgUEFHRV9NQVNLLCBpc193cml0ZSkpCi0JCXJldHVybigwKTsKIAllbHNlIGlmKGN1cnJlbnQtPm1tID09IE5VTEwpCiAJCXBhbmljKCJTZWdmYXVsdCB3aXRoIG5vIG1tIik7CiAJZXJyID0gaGFuZGxlX3BhZ2VfZmF1bHQoYWRkcmVzcywgaXAsIGlzX3dyaXRlLCBpc191c2VyLCAmc2kuc2lfY29kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9rc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwvdHQva3N5bXMuYwppbmRleCA5MmVjODVkLi44NGE5Mzg1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC9rc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2tzeW1zLmMKQEAgLTEyLDYgKzEyLDcgQEAKIEVYUE9SVF9TWU1CT0woX19kb19zdHJuY3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fZG9fc3Rybmxlbl91c2VyKTsgCiBFWFBPUlRfU1lNQk9MKF9fZG9fY2xlYXJfdXNlcik7CitFWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXJfdHQpOwogCiBFWFBPUlRfU1lNQk9MKHRyYWNpbmdfcGlkKTsKIEVYUE9SVF9TWU1CT0woaG9uZXlwb3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCmluZGV4IDc2ZWFkYjMuLmRkNTM1NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKQEAgLTczLDYgKzczLDggQEAKIAogICAuZ290ICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9CiAgIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KICAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKICAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwogICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKaW5kZXggZmNkNjdjMy4uNDM1MWU1NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCkBAIC05LDExICs5LDExIEBACiAKIFNZTUxJTktTID0gYml0b3BzLmMgc2VtYXBob3JlLmMgaGlnaG1lbS5jIG1vZHVsZS5jCiAKK2luY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCisKIGJpdG9wcy5jLWRpciA9IGxpYgogc2VtYXBob3JlLmMtZGlyID0ga2VybmVsCiBoaWdobWVtLmMtZGlyID0gbW0KIG1vZHVsZS5jLWRpciA9IGtlcm5lbAogCiBzdWJkaXItIDo9IHV0aWwKLQotaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvZGVsYXkuYyBiL2FyY2gvdW0vc3lzLWkzODYvZGVsYXkuYwppbmRleCBlOTg5MmVlLi4yYzExYjk3IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2RlbGF5LmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jCkBAIC0xLDUgKzEsNyBAQAotI2luY2x1ZGUgImxpbnV4L2RlbGF5LmgiCi0jaW5jbHVkZSAiYXNtL3BhcmFtLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KIAogdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgdGltZSkKIHsKQEAgLTIwLDEzICsyMiwxOSBAQAogCWludCBpLCBuOwogCiAJbiA9IChsb29wc19wZXJfamlmZnkgKiBIWiAqIHVzZWNzKSAvIE1JTExJT047Ci0JZm9yKGk9MDtpPG47aSsrKSA7CisgICAgICAgIGZvcihpPTA7aTxuO2krKykKKyAgICAgICAgICAgICAgICBjcHVfcmVsYXgoKTsKIH0KIAorRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CisKIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKIHsKIAlpbnQgaSwgbjsKIAogCW4gPSAobG9vcHNfcGVyX2ppZmZ5ICogSFogKiB1c2VjcykgLyBNSUxMSU9OOwotCWZvcihpPTA7aTxuO2krKykgOworICAgICAgICBmb3IoaT0wO2k8bjtpKyspCisgICAgICAgICAgICAgICAgY3B1X3JlbGF4KCk7CiB9CisKK0VYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCmluZGV4IDNkN2RhOTEuLjYwODQ2NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKQEAgLTE0LDExICsxNCwxMSBAQAogCiBVU0VSX09CSlMgOj0gcHRyYWNlX3VzZXIubyBzaWdjb250ZXh0Lm8KIAotaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKLQogU1lNTElOS1MgPSBiaXRvcHMuYyBjc3VtLWNvcHkuUyBjc3VtLXBhcnRpYWwuYyBjc3VtLXdyYXBwZXJzLmMgbWVtY3B5LlMgXAogCXNlbWFwaG9yZS5jIHRodW5rLlMgbW9kdWxlLmMKIAoraW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKKwogYml0b3BzLmMtZGlyID0gbGliCiBjc3VtLWNvcHkuUy1kaXIgPSBsaWIKIGNzdW0tcGFydGlhbC5jLWRpciA9IGxpYgpAQCAtMjgsNiArMjgsNCBAQAogdGh1bmsuUy1kaXIgPSBsaWIKIG1vZHVsZS5jLWRpciA9IGtlcm5lbAogCi1DRkxBR1NfY3N1bS1wYXJ0aWFsLm8gOj0gLURjc3VtX3BhcnRpYWw9YXJjaF9jc3VtX3BhcnRpYWwKLQogc3ViZGlyLSA6PSB1dGlsCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvZGVsYXkuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCmluZGV4IDY1MTMzMmEuLjEzN2Y0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCkBAIC01LDQwICs1LDM3IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAotI2luY2x1ZGUgImxpbnV4L2RlbGF5LmgiCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImFzbS9wYXJhbS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgogCiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQlmb3IoaSA9IDA7IGkgPCBsb29wczsgaSsrKSA7CisgICAgICAgIGZvcihpID0gMDsgaSA8IGxvb3BzOyBpKyspCisgICAgICAgICAgICAgICAgY3B1X3JlbGF4KCk7CiB9CiAKIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKIHsKLQlpbnQgaSwgbjsKKwl1bnNpZ25lZCBsb25nIGksIG47CiAKIAluID0gKGxvb3BzX3Blcl9qaWZmeSAqIEhaICogdXNlY3MpIC8gTUlMTElPTjsKLQlmb3IoaT0wO2k8bjtpKyspIDsKKyAgICAgICAgZm9yKGk9MDtpPG47aSsrKQorICAgICAgICAgICAgICAgIGNwdV9yZWxheCgpOwogfQogCitFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKKwogdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQogewotCWludCBpLCBuOworCXVuc2lnbmVkIGxvbmcgaSwgbjsKIAogCW4gPSAobG9vcHNfcGVyX2ppZmZ5ICogSFogKiB1c2VjcykgLyBNSUxMSU9OOwotCWZvcihpPTA7aTxuO2krKykgOworICAgICAgICBmb3IoaT0wO2k8bjtpKyspCisgICAgICAgICAgICAgICAgY3B1X3JlbGF4KCk7CiB9CiAKLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCitFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9rc3ltcy5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKaW5kZXggYTI3ZjBlZS4uODU5MjczOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMKQEAgLTE2LDUgKzE2LDQgQEAKIEVYUE9SVF9TWU1CT0woX19tZW1jcHkpOwogCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLS8qRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9tKTsKLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfdG8pOyovCitFWFBPUlRfU1lNQk9MKGlwX2NvbXB1dGVfY3N1bSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMKaW5kZXggYjU5M2JiMi4uNzRlZWU1YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3B0cmFjZS5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9wdHJhY2UuYwpAQCAtNSwxMCArNSwxMSBAQAogICovCiAKICNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCi0jaW5jbHVkZSAiYXNtL3B0cmFjZS5oIgotI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCi0jaW5jbHVkZSAibGludXgvZXJybm8uaCIKLSNpbmNsdWRlICJhc20vZWxmLmgiCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KIAogLyogWFhYIHg4Nl82NCAqLwogdW5zaWduZWQgbG9uZyBub3Rfc3M7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zeXNjYWxscy5jCmluZGV4IGRkOTkxNDYuLmQ0YTU5NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zeXNjYWxscy5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zeXNjYWxscy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiYXNtL3VuaXN0ZC5oIgogI2luY2x1ZGUgImFzbS9wcmN0bC5oIiAvKiBYWFggVGhpcyBzaG91bGQgZ2V0IHRoZSBjb25zdGFudHMgZnJvbSBsaWJjICovCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKKyNpbmNsdWRlICJrZXJuLmgiCiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfdW5hbWU2NChzdHJ1Y3QgbmV3X3V0c25hbWUgX191c2VyICogbmFtZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYwppbmRleCA1ZTE0NzkyLi41MTNkMTdjIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvdXNlci1vZmZzZXRzLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3VzZXItb2Zmc2V0cy5jCkBAIC0zLDYgKzMsMTQgQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorLyogRm9yIHNvbWUgcmVhc29uLCB4ODZfNjQgZGVmaW5lcyB1NjQgYW5kIHUzMiBvbmx5IGluIDxwY2kvdHlwZXMuaD4sIHdoaWNoIEkKKyAqIHJlZnVzZSB0byBpbmNsdWRlIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZXkncmUgdXNlZCB0aHJvdWdob3V0IHRoZSBoZWFkZXJzLgorICogVGhlc2UgYXJlIHVzZWQgaW4gYXNtL3VzZXIuaCwgYW5kIHRoYXQgaW5jbHVkZSBjYW4ndCBiZSBhdm9pZGVkIGJlY2F1c2Ugb2YKKyAqIHRoZSBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpIGJlbG93LgorICovCit0eXBlZGVmIF9fdTY0IHU2NDsKK3R5cGVkZWYgX191MzIgdTMyOwogI2luY2x1ZGUgPGFzbS91c2VyLmg+CiAKICNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCA0NGVlN2Y2Li44MmNiMmEzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTMwMyw2ICszMDMsMjAgQEAKIAkgIGFzIGl0IGlzIG9mZi1jaGlwLiAgWW91IGNhbiBmaW5kIHRoZSBIUEVUIHNwZWMgYXQKIAkgIDxodHRwOi8vd3d3LmludGVsLmNvbS9sYWJzL3BsYXRjb21wL2hwZXQvaHBldHNwZWMuaHRtPi4KIAorY29uZmlnIFg4Nl9QTV9USU1FUgorCWJvb2wgIlBNIHRpbWVyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgdGhlIEFDUEkgUE0gdGltZXIgZm9yIHRpbWUga2VlcGluZy4gVGhpcyBpcyBzbG93LAorCSAgYnV0IGlzIHVzZWZ1bCBvbiBzb21lIGNoaXBzZXRzIHdpdGhvdXQgSFBFVCBvbiBzeXN0ZW1zIHdpdGggbW9yZQorCSAgdGhhbiBvbmUgQ1BVLiBPbiBhIHNpbmdsZSBwcm9jZXNzb3Igb3Igc2luZ2xlIHNvY2tldCBtdWx0aSBjb3JlCisJICBzeXN0ZW0gaXQgaXMgbm9ybWFsbHkgbm90IHJlcXVpcmVkLgorCSAgV2hlbiB0aGUgUE0gdGltZXIgaXMgYWN0aXZlIDY0Yml0IHZzeXNjYWxscyBhcmUgZGlzYWJsZWQKKwkgIGFuZCBzaG91bGQgbm90IGJlIGVuYWJsZWQgKC9wcm9jL3N5cy9rZXJuZWwvdnN5c2NhbGw2NCBzaG91bGQKKwkgIG5vdCBiZSBjaGFuZ2VkKS4KKwkgIFRoZSBrZXJuZWwgc2VsZWN0cyB0aGUgUE0gdGltZXIgb25seSBhcyBhIGxhc3QgcmVzb3J0LCBzbyBpdCBpcworCSAgdXNlZnVsIHRvIGVuYWJsZSBqdXN0IGluIGNhc2UuCisKIGNvbmZpZyBIUEVUX0VNVUxBVEVfUlRDCiAJYm9vbCAiUHJvdmlkZSBSVEMgaW50ZXJydXB0IgogCWRlcGVuZHMgb24gSFBFVF9USU1FUiAmJiBSVEM9eQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvZGVmY29uZmlnIGIvYXJjaC94ODZfNjQvZGVmY29uZmlnCmluZGV4IDljZTUxZGUuLjU2OTU5NWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEtYms3Ci0jIFNhdCBNYXIgMTIgMjM6NDM6NDQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjNAorIyBGcmkgTWF5IDEzIDA2OjM5OjExIDIwMDUKICMKIENPTkZJR19YODZfNjQ9eQogQ09ORklHXzY0QklUPXkKQEAgLTExLDggKzExLDYgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfWDg2X0NNUFhDSEc9eQogQ09ORklHX0VBUkxZX1BSSU5USz15Ci1DT05GSUdfSFBFVF9USU1FUj15Ci1DT05GSUdfSFBFVF9FTVVMQVRFX1JUQz15CiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKIENPTkZJR19HRU5FUklDX0lPTUFQPXkKIApAQCAtMjIsNiArMjAsNyBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTMzLDcgKzMyLDYgQEAKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xOAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogQ09ORklHX0lLQ09ORklHPXkKQEAgLTQzLDEwICs0MSwxMSBAQAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKIENPTkZJR19DQ19BTElHTl9MQUJFTFM9MApAQCAtOTMsNiArOTIsOSBAQAogQ09ORklHX05VTUE9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX05SX0NQVVM9OAorQ09ORklHX0hQRVRfVElNRVI9eQorQ09ORklHX1g4Nl9QTV9USU1FUj15CitDT05GSUdfSFBFVF9FTVVMQVRFX1JUQz15CiBDT05GSUdfR0FSVF9JT01NVT15CiBDT05GSUdfU1dJT1RMQj15CiBDT05GSUdfWDg2X01DRT15CkBAIC0xMDAsNiArMTAyLDcgQEAKIENPTkZJR19TRUNDT01QPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVNBX0RNQV9BUEk9eQogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtMTI5LDcgKzEzMiw3IEBACiAjIENPTkZJR19BQ1BJX0lCTSBpcyBub3Qgc2V0CiBDT05GSUdfQUNQSV9UT1NISUJBPXkKIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTIwMDEKLUNPTkZJR19BQ1BJX0RFQlVHPXkKKyMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX0VDPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKQEAgLTE0MSw2ICsxNDQsNyBAQAogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKIENPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQogIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQogIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKQEAgLTE1MCw3ICsxNTQsNiBAQAogIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKLUNPTkZJR19DUFVfRlJFUV9UQUJMRT15CiAKICMKICMgQ1BVRnJlcSBwcm9jZXNzb3IgZHJpdmVycwpAQCAtMTY0LDYgKzE2Nyw3IEBACiAjIHNoYXJlZCBvcHRpb25zCiAjCiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEY9eQorIyBDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zIChQQ0kgZXRjLikKQEAgLTE3Miw5ICsxNzYsMTEgQEAKIENPTkZJR19QQ0lfRElSRUNUPXkKIENPTkZJR19QQ0lfTU1DT05GSUc9eQogQ09ORklHX1VOT1JERVJFRF9JTz15CisjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiBDT05GSUdfUENJX01TST15CiAjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAogIyBDT05GSUdfUENJX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydApAQCAtMTgyLDEwICsxODgsNiBAQAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwotIyBQQy1jYXJkIGJyaWRnZXMKLSMKLQotIwogIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CiAjCiAjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CkBAIC0yNTQsNyArMjU2LDcgQEAKICMgSU8gU2NoZWR1bGVycwogIwogQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKIENPTkZJR19JT1NDSEVEX0NGUT15CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldApAQCAtMzA4LDcgKzMxMCw4IEBACiBDT05GSUdfQkxLX0RFVl9QSUlYPXkKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVc9eQorIyBDT05GSUdfUERDMjAyWFhfRk9SQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TSVM1NTEzIGlzIG5vdCBzZXQKQEAgLTM1Myw3ICszNTYsNyBAQAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCiAjCi1DT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQ9eQorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKQEAgLTM4NCw3ICszODcsNiBAQAogIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0VBVEFfUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldApAQCAtMzkyLDcgKzM5NCw2IEBACiAjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9RTEEyWFhYPXkKQEAgLTQwMSw2ICs0MDIsNyBAQAogIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtNDM3LDcgKzQzOSw2IEBACiAjCiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQpAQCAtNTAyLDcgKzUwMyw3IEBACiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAorQ09ORklHX1RVTj15CiAKICMKICMgQVJDbmV0IGRldmljZXMKQEAgLTUyNSw4ICs1MjYsNyBAQAogIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAogQ09ORklHX05FVF9QQ0k9eQogIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci1DT05GSUdfQU1EODExMV9FVEg9eQotIyBDT05GSUdfQU1EODExMUVfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VERVRIPXkKQEAgLTUzNiw3ICs1MzYsNyBAQAogIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKICMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAogIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotQ09ORklHXzgxMzlDUD1tCitDT05GSUdfODEzOUNQPXkKIENPTkZJR184MTM5VE9PPXkKICMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKICMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKQEAgLTY3MSw2ICs2NzEsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTY5Niw2ICs2OTcsNyBAQAogIwogQ09ORklHX0FHUD15CiBDT05GSUdfQUdQX0FNRDY0PXkKK0NPTkZJR19BR1BfSU5URUw9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX01XQVZFIGlzIG5vdCBzZXQKIENPTkZJR19SQVdfRFJJVkVSPXkKQEAgLTcwMyw3ICs3MDUsNyBAQAogIyBDT05GSUdfSFBFVF9SVENfSVJRIGlzIG5vdCBzZXQKIENPTkZJR19IUEVUX01NQVA9eQogQ09ORklHX01BWF9SQVdfREVWUz0yNTYKLUNPTkZJR19IQU5HQ0hFQ0tfVElNRVI9eQorIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwpAQCAtNzg2LDYgKzc4OCw4IEBACiAjCiAjIFVTQiBzdXBwb3J0CiAjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQogQ09ORklHX1VTQj15CiAjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAogCkBAIC03OTcsOCArODAxLDYgQEAKICMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CiAKICMKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCkBAIC04MjYsNyArODI4LDYgQEAKICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9SV19ERVRFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CkBAIC05NjUsNyArOTY2LDcgQEAKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogQ09ORklHX0lTTzk2NjBfRlM9eQotIyBDT05GSUdfSk9MSUVUIGlzIG5vdCBzZXQKK0NPTkZJR19KT0xJRVQ9eQogIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CiAKQEAgLTEwOTIsOSArMTA5MywxMCBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMGEzMzE4ZS4uNWNhNGE0NSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0RVTU1ZX0lPTU1VKQkrPSBwY2ktbm9tbXUubyBwY2ktZG1hLm8KIG9iai0kKENPTkZJR19TV0lPVExCKQkJKz0gc3dpb3RsYi5vCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubworb2JqLSQoQ09ORklHX1g4Nl9QTV9USU1FUikJKz0gcG10aW1lci5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKaW5kZXggN2UxMzU0NS4uZjhlNmNjNCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogaW50IGFwaWNfdmVyYm9zaXR5OwogCkBAIC05MjUsNyArOTI2LDcgQEAKIAl1bnNpZ25lZCBpZDsKIAlERUNMQVJFX0JJVE1BUChjbHVzdGVybWFwLCBOVU1fQVBJQ19DTFVTVEVSUyk7CiAKLQliaXRtYXBfZW1wdHkoY2x1c3Rlcm1hcCwgTlVNX0FQSUNfQ0xVU1RFUlMpOworCWJpdG1hcF96ZXJvKGNsdXN0ZXJtYXAsIE5VTV9BUElDX0NMVVNURVJTKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKIAkJaWQgPSBiaW9zX2NwdV9hcGljaWRbaV07CkBAIC0xMDU2LDcgKzEwNTcsNyBAQAogCQlucl9pb2FwaWNzID0gMDsKICNlbmRpZgogCXNldHVwX2Jvb3RfQVBJQ19jbG9jaygpOwotCisJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKaW5kZXggMTA4NmI1Zi4uMjg4MTc0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKQEAgLTIyMCwxMyArMjIwLDE4IEBACiAJam1wIHN5c3JldF9jaGVjawogCiAJLyogSGFuZGxlIGEgc2lnbmFsICovIAotCS8qIGVkeDoJd29yayBmbGFncyAoYXJnMykgKi8KIHN5c3JldF9zaWduYWw6CiAJc3RpCisJdGVzdGwgJChfVElGX1NJR1BFTkRJTkd8X1RJRl9OT1RJRllfUkVTVU1FfF9USUZfU0lOR0xFU1RFUCksJWVkeAorCWp6ICAgIDFmCisKKwkvKiBSZWFsbHkgYSBzaWduYWwgKi8KKwkvKiBlZHg6CXdvcmsgZmxhZ3MgKGFyZzMpICovCiAJbGVhcSBkb19ub3RpZnlfcmVzdW1lKCVyaXApLCVyYXgKIAlsZWFxIC1BUkdPRkZTRVQoJXJzcCksJXJkaSAjICZwdF9yZWdzIC0+IGFyZzEKIAl4b3JsICVlc2ksJWVzaSAjIG9sZHNldCAtPiBhcmcyCiAJY2FsbCBwdHJlZ3NjYWxsX2NvbW1vbgorMToJbW92bCAkX1RJRl9ORUVEX1JFU0NIRUQsJWVkaQogCWptcCBzeXNyZXRfY2hlY2sKIAkKIAkvKiBEbyBzeXNjYWxsIHRyYWNpbmcgKi8KQEAgLTQ4NCw2ICs0ODksOCBAQAogCWptcCByZXRpbnRfY2hlY2sKIAkKIHJldGludF9zaWduYWw6CisJdGVzdGwgJChfVElGX1NJR1BFTkRJTkd8X1RJRl9OT1RJRllfUkVTVU1FfF9USUZfU0lOR0xFU1RFUCksJWVkeAorCWp6ICAgIHJldGludF9zd2FwZ3MKIAlzdGkKIAlTQVZFX1JFU1QKIAltb3ZxICQtMSxPUklHX1JBWCglcnNwKSAJCQkKQEAgLTQ5Miw4ICs0OTksOCBAQAogCWNhbGwgZG9fbm90aWZ5X3Jlc3VtZQogCVJFU1RPUkVfUkVTVAogCWNsaQorCW1vdmwgJF9USUZfTkVFRF9SRVNDSEVELCVlZGkKIAlHRVRfVEhSRUFEX0lORk8oJXJjeCkKLQltb3ZsICRfVElGX1dPUktfTUFTSywlZWRpCiAJam1wIHJldGludF9jaGVjawogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDYwYmU1ODYuLjgwZTliNDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtNDIsNiArNDIsOCBAQAogCiBpbnQgc2lzX2FwaWNfYnVnOyAvKiBub3QgYWN0dWFsbHkgc3VwcG9ydGVkLCBkdW1teSBmb3IgY29tcGlsZSAqLwogCitzdGF0aWMgaW50IG5vX3RpbWVyX2NoZWNrOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19sb2NrKTsKIAogLyoKQEAgLTE2MDEsNyArMTYwMyw3IEBACiAJCSAqIE9rLCBkb2VzIElSUTAgdGhyb3VnaCB0aGUgSU9BUElDIHdvcms/CiAJCSAqLwogCQl1bm1hc2tfSU9fQVBJQ19pcnEoMCk7Ci0JCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgeworCQlpZiAoIW5vX3RpbWVyX2NoZWNrICYmIHRpbWVyX2lycV93b3JrcygpKSB7CiAJCQlubWlfd2F0Y2hkb2dfZGVmYXVsdCgpOwogCQkJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgewogCQkJCWRpc2FibGVfODI1OUFfaXJxKDApOwpAQCAtMTY3MSw2ICsxNjczLDEzIEBACiAJcGFuaWMoIklPLUFQSUMgKyB0aW1lciBkb2Vzbid0IHdvcmshIFRyeSB1c2luZyB0aGUgJ25vYXBpYycga2VybmVsIHBhcmFtZXRlclxuIik7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IG5vdGltZXJjaGVjayhjaGFyICpzKQoreworCW5vX3RpbWVyX2NoZWNrID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vX3RpbWVyX2NoZWNrIiwgbm90aW1lcmNoZWNrKTsKKwogLyoKICAqCiAgKiBJUlEncyB0aGF0IGFyZSBoYW5kbGVkIGJ5IHRoZSBQSUMgaW4gdGhlIE1QUyBJT0FQSUMgY2FzZS4KQEAgLTE4MDQsNzYgKzE4MTMsNiBAQAogCiAjZGVmaW5lIElPX0FQSUNfTUFYX0lECQkweEZFCiAKLWludCBfX2luaXQgaW9fYXBpY19nZXRfdW5pcXVlX2lkIChpbnQgaW9hcGljLCBpbnQgYXBpY19pZCkKLXsKLQl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7Ci0Jc3RhdGljIHBoeXNpZF9tYXNrX3QgYXBpY19pZF9tYXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaSA9IDA7Ci0KLQkvKgotCSAqIFRoZSBQNCBwbGF0Zm9ybSBzdXBwb3J0cyB1cCB0byAyNTYgQVBJQyBJRHMgb24gdHdvIHNlcGFyYXRlIEFQSUMgCi0JICogYnVzZXMgKG9uZSBmb3IgTEFQSUNzLCBvbmUgZm9yIElPQVBJQ3MpLCB3aGVyZSBwcmVkZWNlc3NvcnMgb25seSAKLQkgKiBzdXBwb3J0cyB1cCB0byAxNiBvbiBvbmUgc2hhcmVkIEFQSUMgYnVzLgotCSAqIAotCSAqIFRCRDogRXhwYW5kIExBUElDL0lPQVBJQyBzdXBwb3J0IG9uIFA0LWNsYXNzIHN5c3RlbXMgdG8gdGFrZSBmdWxsCi0JICogICAgICBhZHZhbnRhZ2Ugb2YgbmV3IEFQSUMgYnVzIGFyY2hpdGVjdHVyZS4KLQkgKi8KLQotCWlmIChwaHlzaWRzX2VtcHR5KGFwaWNfaWRfbWFwKSkKLQkJYXBpY19pZF9tYXAgPSBwaHlzX2NwdV9wcmVzZW50X21hcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGFwaWNfaWQgPj0gSU9fQVBJQ19NQVhfSUQpIHsKLQkJYXBpY19wcmludGsoQVBJQ19RVUlFVCwgS0VSTl9XQVJOSU5HICJJT0FQSUNbJWRdOiBJbnZhbGlkIGFwaWNfaWQgJWQsIHRyeWluZyAiCi0JCQkiJWRcbiIsIGlvYXBpYywgYXBpY19pZCwgcmVnXzAwLmJpdHMuSUQpOwotCQlhcGljX2lkID0gcmVnXzAwLmJpdHMuSUQ7Ci0JfQotCi0JLyoKLQkgKiBFdmVyeSBBUElDIGluIGEgc3lzdGVtIG11c3QgaGF2ZSBhIHVuaXF1ZSBJRCBvciB3ZSBnZXQgbG90cyBvZiBuaWNlIAotCSAqICdzdHVjayBvbiBzbXBfaW52YWxpZGF0ZV9uZWVkZWQgSVBJIHdhaXQnIG1lc3NhZ2VzLgotCSAqLwotCWlmIChwaHlzaWRfaXNzZXQoYXBpY19pZCwgYXBpY19pZF9tYXApKSB7Ci0KLQkJZm9yIChpID0gMDsgaSA8IElPX0FQSUNfTUFYX0lEOyBpKyspIHsKLQkJCWlmICghcGh5c2lkX2lzc2V0KGksIGFwaWNfaWRfbWFwKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IElPX0FQSUNfTUFYX0lEKQotCQkJcGFuaWMoIk1heCBhcGljX2lkIGV4Y2VlZGVkIVxuIik7Ci0KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX1dBUk5JTkcgIklPQVBJQ1slZF06IGFwaWNfaWQgJWQgYWxyZWFkeSB1c2VkLCAiCi0JCQkidHJ5aW5nICVkXG4iLCBpb2FwaWMsIGFwaWNfaWQsIGkpOwotCi0JCWFwaWNfaWQgPSBpOwotCX0gCi0KLQlwaHlzaWRfc2V0KGFwaWNfaWQsIGFwaWNfaWRfbWFwKTsKLQotCWlmIChyZWdfMDAuYml0cy5JRCAhPSBhcGljX2lkKSB7Ci0JCXJlZ18wMC5iaXRzLklEID0gYXBpY19pZDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkJaW9fYXBpY193cml0ZShpb2FwaWMsIDAsIHJlZ18wMC5yYXcpOwotCQlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0KLQkJLyogU2FuaXR5IGNoZWNrICovCi0JCWlmIChyZWdfMDAuYml0cy5JRCAhPSBhcGljX2lkKQotCQkJcGFuaWMoIklPQVBJQ1slZF06IFVuYWJsZSBjaGFuZ2UgYXBpY19pZCFcbiIsIGlvYXBpYyk7Ci0JfQotCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLEtFUk5fSU5GTyAiSU9BUElDWyVkXTogQXNzaWduZWQgYXBpY19pZCAlZFxuIiwgaW9hcGljLCBhcGljX2lkKTsKLQotCXJldHVybiBhcGljX2lkOwotfQotCi0KIGludCBfX2luaXQgaW9fYXBpY19nZXRfdmVyc2lvbiAoaW50IGlvYXBpYykKIHsKIAl1bmlvbiBJT19BUElDX3JlZ18wMQlyZWdfMDE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYwppbmRleCA3ZWMwMzFjLi5mODZkOWRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTEwNyw2ICsxMDcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm0pCiB7CiAJaW50IHZlcjsKKwlzdGF0aWMgaW50IGZvdW5kX2JzcD0wOwogCiAJaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCiAJCXJldHVybjsKQEAgLTEyNiwxMSArMTI3LDYgQEAKIAkJCSIgUHJvY2Vzc29yIGlnbm9yZWQuXG4iLCBOUl9DUFVTKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAobnVtX3Byb2Nlc3NvcnMgPj0gbWF4Y3B1cykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBtYXhjcHVzIGxpbWl0IG9mICVpIHJlYWNoZWQuIgotCQkJIiBQcm9jZXNzb3IgaWdub3JlZC5cbiIsIG1heGNwdXMpOwotCQlyZXR1cm47Ci0JfQogCiAJbnVtX3Byb2Nlc3NvcnMrKzsKIApAQCAtMTUwLDcgKzE0NiwxOSBAQAogCQl2ZXIgPSAweDEwOwogCX0KIAlhcGljX3ZlcnNpb25bbS0+bXBjX2FwaWNpZF0gPSB2ZXI7Ci0JYmlvc19jcHVfYXBpY2lkW251bV9wcm9jZXNzb3JzIC0gMV0gPSBtLT5tcGNfYXBpY2lkOworIAlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworIAkJLyoKKyAJCSAqIGJpb3NfY3B1X2FwaWNpZCBpcyByZXF1aXJlZCB0byBoYXZlIHByb2Nlc3NvcnMgbGlzdGVkCisgCQkgKiBpbiBzYW1lIG9yZGVyIGFzIGxvZ2ljYWwgY3B1IG51bWJlcnMuIEhlbmNlIHRoZSBmaXJzdAorIAkJICogZW50cnkgaXMgQlNQLCBhbmQgc28gb24uCisgCQkgKi8KKyAJCWJpb3NfY3B1X2FwaWNpZFswXSA9IG0tPm1wY19hcGljaWQ7CisgCQl4ODZfY3B1X3RvX2FwaWNpZFswXSA9IG0tPm1wY19hcGljaWQ7CisgCQlmb3VuZF9ic3AgPSAxOworIAl9IGVsc2UgeworIAkJYmlvc19jcHVfYXBpY2lkW251bV9wcm9jZXNzb3JzIC0gZm91bmRfYnNwXSA9IG0tPm1wY19hcGljaWQ7CisgCQl4ODZfY3B1X3RvX2FwaWNpZFtudW1fcHJvY2Vzc29ycyAtIGZvdW5kX2JzcF0gPSBtLT5tcGNfYXBpY2lkOworIAl9CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBNUF9idXNfaW5mbyAoc3RydWN0IG1wY19jb25maWdfYnVzICptKQpAQCAtNzU5LDcgKzc2Nyw3IEBACiAJbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciA9IGFkZHJlc3M7CiAKIAlzZXRfZml4bWFwX25vY2FjaGUoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4LCBhZGRyZXNzKTsKLQltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCA9IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZChpZHgsIGlkKTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCA9IGlkOwogCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciA9IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaWR4KTsKIAkKIAkvKiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA2MWRlMGIzLi4zMWMwZjJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKyNpbmNsdWRlIDxhc20vbG9jYWwuaD4KIAogLyoKICAqIGxhcGljX25taV9vd25lciB0cmFja3MgdGhlIG93bmVyc2hpcCBvZiB0aGUgbGFwaWMgTk1JIGhhcmR3YXJlOgpAQCAtNTksNyArNjAsOCBAQAogCiB1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX0RFRkFVTFQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5taV9oeiA9IEhaOwotdW5zaWduZWQgaW50IG5taV9wZXJmY3RyX21zcjsJLyogdGhlIE1TUiB0byByZXNldCBpbiBOTUkgaGFuZGxlciAqLworc3RhdGljIHVuc2lnbmVkIGludCBubWlfcGVyZmN0cl9tc3I7CS8qIHRoZSBNU1IgdG8gcmVzZXQgaW4gTk1JIGhhbmRsZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX3A0X2NjY3JfdmFsOwogCiAvKiBOb3RlIHRoYXQgdGhlc2UgZXZlbnRzIGRvbid0IHRpY2sgd2hlbiB0aGUgQ1BVIGlkbGVzLiBUaGlzIG1lYW5zCiAgICB0aGUgZnJlcXVlbmN5IHZhcmllcyB3aXRoIENQVSBsb2FkLiAqLwpAQCAtNzEsNjEgKzczLDg3IEBACiAjZGVmaW5lIEs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORwkweDc2CiAjZGVmaW5lIEs3X05NSV9FVkVOVAkJSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCiAKLSNkZWZpbmUgUDZfRVZOVFNFTDBfRU5BQkxFCSgxIDw8IDIyKQotI2RlZmluZSBQNl9FVk5UU0VMX0lOVAkJKDEgPDwgMjApCi0jZGVmaW5lIFA2X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQotI2RlZmluZSBQNl9FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCi0jZGVmaW5lIFA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAkweDc5Ci0jZGVmaW5lIFA2X05NSV9FVkVOVAkJUDZfRVZFTlRfQ1BVX0NMT0NLU19OT1RfSEFMVEVECisjZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRQkweDFBMAorI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTAkoMTw8NykKKyNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTAkoMTw8MTIpCisjZGVmaW5lIE1TUl9QNF9QRVJGQ1RSMAkJMHgzMDAKKyNkZWZpbmUgTVNSX1A0X0NDQ1IwCQkweDM2MAorI2RlZmluZSBQNF9FU0NSX0VWRU5UX1NFTEVDVChOKQkoKE4pPDwyNSkKKyNkZWZpbmUgUDRfRVNDUl9PUwkJKDE8PDMpCisjZGVmaW5lIFA0X0VTQ1JfVVNSCQkoMTw8MikKKyNkZWZpbmUgUDRfQ0NDUl9PVkZfUE1JMAkoMTw8MjYpCisjZGVmaW5lIFA0X0NDQ1JfT1ZGX1BNSTEJKDE8PDI3KQorI2RlZmluZSBQNF9DQ0NSX1RIUkVTSE9MRChOKQkoKE4pPDwyMCkKKyNkZWZpbmUgUDRfQ0NDUl9DT01QTEVNRU5UCSgxPDwxOSkKKyNkZWZpbmUgUDRfQ0NDUl9DT01QQVJFCQkoMTw8MTgpCisjZGVmaW5lIFA0X0NDQ1JfUkVRVUlSRUQJKDM8PDE2KQorI2RlZmluZSBQNF9DQ0NSX0VTQ1JfU0VMRUNUKE4pCSgoTik8PDEzKQorI2RlZmluZSBQNF9DQ0NSX0VOQUJMRQkJKDE8PDEyKQorLyogU2V0IHVwIElRX0NPVU5URVIwIHRvIGJlaGF2ZSBsaWtlIGEgY2xvY2ssIGJ5IGhhdmluZyBJUV9DQ0NSMCBmaWx0ZXIKKyAgIENSVV9FU0NSMCAod2l0aCBhbnkgbm9uLW51bGwgZXZlbnQgc2VsZWN0b3IpIHRocm91Z2ggYSBjb21wbGVtZW50ZWQKKyAgIG1heCB0aHJlc2hvbGQuIFtJQTMyLVZvbDMsIFNlY3Rpb24gMTQuOS45XSAqLworI2RlZmluZSBNU1JfUDRfSVFfQ09VTlRFUjAJMHgzMEMKKyNkZWZpbmUgUDRfTk1JX0NSVV9FU0NSMAkoUDRfRVNDUl9FVkVOVF9TRUxFQ1QoMHgzRil8UDRfRVNDUl9PU3xQNF9FU0NSX1VTUikKKyNkZWZpbmUgUDRfTk1JX0lRX0NDQ1IwCVwKKwkoUDRfQ0NDUl9PVkZfUE1JMHxQNF9DQ0NSX1RIUkVTSE9MRCgxNSl8UDRfQ0NDUl9DT01QTEVNRU5UfAlcCisJIFA0X0NDQ1JfQ09NUEFSRXxQNF9DQ0NSX1JFUVVJUkVEfFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCl8UDRfQ0NDUl9FTkFCTEUpCisKK3N0YXRpYyBfX2luaXQgaW5saW5lIGludCBubWlfa25vd25fY3B1KHZvaWQpCit7CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODYgPT0gMTU7CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODYgPT0gMTU7CisJfQorCXJldHVybiAwOworfQogCiAvKiBSdW4gYWZ0ZXIgY29tbWFuZCBsaW5lIGFuZCBjcHVfaW5pdCBpbml0LCBidXQgYmVmb3JlIGFsbCBvdGhlciBjaGVja3MgKi8KIHZvaWQgX19pbml0IG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpCiB7CiAJaWYgKG5taV93YXRjaGRvZyAhPSBOTUlfREVGQVVMVCkKIAkJcmV0dXJuOwotCi0JLyogRm9yIHNvbWUgcmVhc29uIHRoZSBJTyBBUElDIHdhdGNoZG9nIGRvZXNuJ3Qgd29yayBvbiB0aGUgQU1ECi0JICAgODExMSBjaGlwc2V0LiBGb3Igbm93IHN3aXRjaCB0byBsb2NhbCBBUElDIG1vZGUgdXNpbmcKLQkgICBwZXJmY3RyMCB0aGVyZS4gIE9uIEludGVsIENQVXMgd2UgZG9uJ3QgaGF2ZSBjb2RlIHRvIGhhbmRsZQotCSAgIHRoZSBwZXJmY3RyIGFuZCB0aGUgSU8tQVBJQyBzZWVtcyB0byB3b3JrLCBzbyB1c2UgdGhhdC4gICovCi0KLQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKSB7Ci0JCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOyAKLQkJcHJpbnRrKEtFUk5fSU5GTyAKLSAgICAgICAgICAgICAgIlVzaW5nIGxvY2FsIEFQSUMgTk1JIHdhdGNoZG9nIHVzaW5nIHBlcmZjdHIwXG4iKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBJTyBBUElDIE5NSSB3YXRjaGRvZ1xuIik7CisJaWYgKG5taV9rbm93bl9jcHUoKSkKKwkJbm1pX3dhdGNoZG9nID0gTk1JX0xPQ0FMX0FQSUM7CisJZWxzZQogCQlubWlfd2F0Y2hkb2cgPSBOTUlfSU9fQVBJQzsKLQl9CiB9CiAKLS8qIFdoeSBpcyB0aGVyZSBubyBDUFVJRCBmbGFnIGZvciB0aGlzPyAqLwotc3RhdGljIF9faW5pdCBpbnQgY3B1X2hhc19sYXBpYyh2b2lkKQorI2lmZGVmIENPTkZJR19TTVAKKy8qIFRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB1c2VkIGJ5IE5NSV9MT0NBTF9BUElDIGRvbid0IHRyaWdnZXIgd2hlbgorICogdGhlIENQVSBpcyBpZGxlLiBUbyBtYWtlIHN1cmUgdGhlIE5NSSB3YXRjaGRvZyByZWFsbHkgdGlja3Mgb24gYWxsCisgKiBDUFVzIGR1cmluZyB0aGUgdGVzdCBtYWtlIHRoZW0gYnVzeS4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIG5taV9jcHVfYnVzeSh2b2lkICpkYXRhKQogewotCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7IAotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOiAKLQkJcmV0dXJuIGJvb3RfY3B1X2RhdGEueDg2ID49IDY7IAotCS8qIC4uLi4gYWRkIG1vcmUgY3B1cyBoZXJlIG9yIGZpbmQgYSBkaWZmZXJlbnQgd2F5IHRvIGZpZ3VyZSB0aGlzIG91dC4gKi8JCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfSAJCisJdm9sYXRpbGUgaW50ICplbmRmbGFnID0gZGF0YTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJLyogSW50ZW50aW9uYWxseSBkb24ndCB1c2UgY3B1X3JlbGF4IGhlcmUuIFRoaXMgaXMKKwkgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgY291bnRlciByZWFsbHkgdGlja3MsCisJICAgZXZlbiBpZiB0aGVyZSBpcyBhIHNpbXVsYXRvciBvciBzaW1pbGFyIHRoYXQgY2F0Y2hlcyB0aGUKKwkgICBwYXVzZSBpbnN0cnVjdGlvbi4gT24gYSByZWFsIEhUIG1hY2hpbmUgdGhpcyBpcyBmaW5lIGJlY2F1c2UKKwkgICBhbGwgb3RoZXIgQ1BVcyBhcmUgYnVzeSB3aXRoICJ1c2VsZXNzIiBkZWxheSBsb29wcyBhbmQgZG9uJ3QKKwkgICBjYXJlIGlmIHRoZXkgZ2V0IHNvbWV3aGF0IGxlc3MgY3ljbGVzLiAqLworCXdoaWxlICgqZW5kZmxhZyA9PSAwKQorCQliYXJyaWVyKCk7CiB9CisjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQgY2hlY2tfbm1pX3dhdGNoZG9nICh2b2lkKQoraW50IF9faW5pdCBjaGVja19ubWlfd2F0Y2hkb2cgKHZvaWQpCiB7Ci0JaW50IGNvdW50c1tOUl9DUFVTXTsKKwl2b2xhdGlsZSBpbnQgZW5kZmxhZyA9IDA7CisJaW50ICpjb3VudHM7CiAJaW50IGNwdTsKIAotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX05PTkUpCi0JCXJldHVybiAwOworCWNvdW50cyA9IGttYWxsb2MoTlJfQ1BVUyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvdW50cykKKwkJcmV0dXJuIC0xOwogCi0JaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQyAmJiAhY3B1X2hhc19sYXBpYygpKSAgewotCQlubWlfd2F0Y2hkb2cgPSBOTUlfTk9ORTsKLQkJcmV0dXJuIC0xOyAKLQl9CQorCXByaW50ayhLRVJOX0lORk8gInRlc3RpbmcgTk1JIHdhdGNoZG9nIC4uLiAiKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlRlc3RpbmcgTk1JIHdhdGNoZG9nIC4uLiAiKTsKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlzbXBfY2FsbF9mdW5jdGlvbihubWlfY3B1X2J1c3ksICh2b2lkICopJmVuZGZsYWcsIDAsIDApOwogCiAJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKIAkJY291bnRzW2NwdV0gPSBjcHVfcGRhW2NwdV0uX19ubWlfY291bnQ7IApAQCAtMTMzLDE1ICsxNjEsMjIgQEAKIAltZGVsYXkoKDEwKjEwMDApL25taV9oeik7IC8vIHdhaXQgMTAgdGlja3MKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGNwdSkpCisJCQljb250aW51ZTsKIAkJaWYgKGNwdV9wZGFbY3B1XS5fX25taV9jb3VudCAtIGNvdW50c1tjcHVdIDw9IDUpIHsKLQkJCXByaW50aygiQ1BVIyVkOiBOTUkgYXBwZWFycyB0byBiZSBzdHVjayAoJWQpIVxuIiwgCisJCQllbmRmbGFnID0gMTsKKwkJCXByaW50aygiQ1BVIyVkOiBOTUkgYXBwZWFycyB0byBiZSBzdHVjayAoJWQtPiVkKSFcbiIsCiAJCQkgICAgICAgY3B1LAorCQkJICAgICAgIGNvdW50c1tjcHVdLAogCQkJICAgICAgIGNwdV9wZGFbY3B1XS5fX25taV9jb3VudCk7CiAJCQlubWlfYWN0aXZlID0gMDsKIAkJCWxhcGljX25taV9vd25lciAmPSB+TEFQSUNfTk1JX1dBVENIRE9HOworCQkJbm1pX3BlcmZjdHJfbXNyID0gMDsKKwkJCWtmcmVlKGNvdW50cyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CisJZW5kZmxhZyA9IDE7CiAJcHJpbnRrKCJPSy5cbiIpOwogCiAJLyogbm93IHRoYXQgd2Uga25vdyBpdCB3b3JrcyB3ZSBjYW4gcmVkdWNlIE5NSSBmcmVxdWVuY3kgdG8KQEAgLTE0OSwxMCArMTg0LDkgQEAKIAlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQogCQlubWlfaHogPSAxOwogCisJa2ZyZWUoY291bnRzKTsKIAlyZXR1cm4gMDsKIH0KLS8qIEhhdmUgdGhpcyBjYWxsZWQgbGF0ZXIgZHVyaW5nIGJvb3Qgc28gY291bnRlcnMgYXJlIHVwZGF0aW5nICovCi1sYXRlX2luaXRjYWxsKGNoZWNrX25taV93YXRjaGRvZyk7CiAKIGludCBfX2luaXQgc2V0dXBfbm1pX3dhdGNoZG9nKGNoYXIgKnN0cikKIHsKQEAgLTE3MCw3ICsyMDQsNyBAQAogCiAJaWYgKG5taSA+PSBOTUlfSU5WQUxJRCkKIAkJcmV0dXJuIDA7Ci0JCW5taV93YXRjaGRvZyA9IG5taTsKKwlubWlfd2F0Y2hkb2cgPSBubWk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE4NSw3ICsyMTksMTAgQEAKIAkJd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCAwLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQl3cm1zcihNU1JfSUEzMl9FVk5UU0VMMCwgMCwgMCk7CisJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkgeworCQkJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCAwLCAwKTsKKwkJCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIDAsIDApOworCQl9CiAJCWJyZWFrOwogCX0KIAlubWlfYWN0aXZlID0gLTE7CkBAIC0yNTMsNyArMjkwLDcgQEAKIAogc3RhdGljIGludCBubWlfcG1fYWN0aXZlOyAvKiBubWlfYWN0aXZlIGJlZm9yZSBzdXNwZW5kICovCiAKLXN0YXRpYyBpbnQgbGFwaWNfbm1pX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBsYXBpY19ubWlfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCB1MzIgc3RhdGUpCiB7CiAJbm1pX3BtX2FjdGl2ZSA9IG5taV9hY3RpdmU7CiAJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKQEAgLTMwMCwyMiArMzM3LDI3IEBACiAgKiBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnkgS2VpdGggT3dlbnMuCiAgKi8KIAorc3RhdGljIHZvaWQgY2xlYXJfbXNyX3JhbmdlKHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IG47ICsraSkKKwkJd3Jtc3IoYmFzZStpLCAwLCAwKTsKK30KKwogc3RhdGljIHZvaWQgc2V0dXBfazdfd2F0Y2hkb2codm9pZCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgZXZudHNlbDsKIAotCS8qIE5vIGNoZWNrLCBzbyBjYW4gc3RhcnQgd2l0aCBzbG93IGZyZXF1ZW5jeSAqLwotCW5taV9oeiA9IDE7IAotCi0JLyogWFhYIHNob3VsZCBjaGVjayB0aGVzZSBpbiBFRkVSICovCi0KIAlubWlfcGVyZmN0cl9tc3IgPSBNU1JfSzdfUEVSRkNUUjA7CiAKIAlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKIAkJLyogU2ltdWxhdG9yIG1heSBub3Qgc3VwcG9ydCBpdCAqLwotCQlpZiAoY2hlY2tpbmdfd3Jtc3JsKE1TUl9LN19FVk5UU0VMMCtpLCAwVUwpKQorCQlpZiAoY2hlY2tpbmdfd3Jtc3JsKE1TUl9LN19FVk5UU0VMMCtpLCAwVUwpKSB7CisJCQlubWlfcGVyZmN0cl9tc3IgPSAwOwogCQkJcmV0dXJuOworCQl9CiAJCXdybXNybChNU1JfSzdfUEVSRkNUUjAraSwgMFVMKTsKIAl9CiAKQEAgLTMyNSwxMiArMzY3LDU0IEBACiAJCXwgSzdfTk1JX0VWRU5UOwogCiAJd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKLQl3cm1zcmwoTVNSX0s3X1BFUkZDVFIwLCAtKCh1NjQpY3B1X2toeioxMDAwKSAvIG5taV9oeik7CisJd3Jtc3IoTVNSX0s3X1BFUkZDVFIwLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CiAJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CiAJZXZudHNlbCB8PSBLN19FVk5UU0VMX0VOQUJMRTsKIAl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIGV2bnRzZWwsIDApOwogfQogCisKK3N0YXRpYyBpbnQgc2V0dXBfcDRfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbWlzY19lbmFibGUsIGR1bW15OworCisJcmRtc3IoTVNSX1A0X01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSwgZHVtbXkpOworCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFUkZfQVZBSUwpKQorCQlyZXR1cm4gMDsKKworCW5taV9wZXJmY3RyX21zciA9IE1TUl9QNF9JUV9DT1VOVEVSMDsKKwlubWlfcDRfY2Njcl92YWwgPSBQNF9OTUlfSVFfQ0NDUjA7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpCisJCW5taV9wNF9jY2NyX3ZhbCB8PSBQNF9DQ0NSX09WRl9QTUkxOworI2VuZGlmCisKKwlpZiAoIShtaXNjX2VuYWJsZSAmIE1TUl9QNF9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwpKQorCQljbGVhcl9tc3JfcmFuZ2UoMHgzRjEsIDIpOworCS8qIE1TUiAweDNGMCBzZWVtcyB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBvZiAweEZDMDAsIGJ1dCBjdXJyZW50CisJICAgZG9jcyBkb2Vzbid0IGZ1bGx5IGRlZmluZSBpdCwgc28gbGVhdmUgaXQgYWxvbmUgZm9yIG5vdy4gKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gMHgzKSB7CisJCS8qIE1TUl9QNF9JUV9FU0NSMC8xICgweDNiYS8weDNiYikgcmVtb3ZlZCAqLworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDI2KTsKKwkJY2xlYXJfbXNyX3JhbmdlKDB4M0JDLCAzKTsKKwl9IGVsc2UgeworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDMxKTsKKwl9CisJY2xlYXJfbXNyX3JhbmdlKDB4M0MwLCA2KTsKKwljbGVhcl9tc3JfcmFuZ2UoMHgzQzgsIDYpOworCWNsZWFyX21zcl9yYW5nZSgweDNFMCwgMik7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNF9DQ0NSMCwgMTgpOworCWNsZWFyX21zcl9yYW5nZShNU1JfUDRfUEVSRkNUUjAsIDE4KTsKKworCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIFA0X05NSV9DUlVfRVNDUjAsIDApOworCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgUDRfTk1JX0lRX0NDQ1IwICYgflA0X0NDQ1JfRU5BQkxFLCAwKTsKKwlEcHJpbnRrKCJzZXR0aW5nIFA0X0lRX0NPVU5URVIwIHRvIDB4JTA4bHhcbiIsIC0oY3B1X2toei9ubWlfaHoqMTAwMCkpOworCXdybXNyKE1TUl9QNF9JUV9DT1VOVEVSMCwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgLTEpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgbm1pX3A0X2NjY3JfdmFsLCAwKTsKKwlyZXR1cm4gMTsKK30KKwogdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyh2b2lkKQogewogCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CkBAIC0zNDEsNiArNDI1LDEzIEBACiAJCQlyZXR1cm47CiAJCXNldHVwX2s3X3dhdGNoZG9nKCk7CiAJCWJyZWFrOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ICE9IDE1KQorCQkJcmV0dXJuOworCQlpZiAoIXNldHVwX3A0X3dhdGNoZG9nKCkpCisJCQlyZXR1cm47CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KQEAgLTM1NSw1NiArNDQ2LDY3IEBACiAgKgogICogYXMgdGhlc2Ugd2F0Y2hkb2cgTk1JIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBldmVyeSBDUFUsIHdlIG9ubHkKICAqIGhhdmUgdG8gY2hlY2sgdGhlIGN1cnJlbnQgcHJvY2Vzc29yLgotICoKLSAqIHNpbmNlIE5NSXMgZG9uJ3QgbGlzdGVuIHRvIF9hbnlfIGxvY2tzLCB3ZSBoYXZlIHRvIGJlIGV4dHJlbWVseQotICogY2FyZWZ1bCBub3QgdG8gcmVseSBvbiB1bnNhZmUgdmFyaWFibGVzLiBUaGUgcHJpbnRrIG1pZ2h0IGxvY2sKLSAqIHVwIHRob3VnaCwgc28gd2UgaGF2ZSB0byBicmVhayB1cCBhbnkgY29uc29sZSBsb2NrcyBmaXJzdCAuLi4KLSAqIFt3aGVuIHRoZXJlIHdpbGwgYmUgbW9yZSB0dHktcmVsYXRlZCBsb2NrcywgYnJlYWsgdGhlbSB1cAotICogIGhlcmUgdG9vIV0KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci0JbGFzdF9pcnFfc3VtcyBbTlJfQ1BVU10sCi0JYWxlcnRfY291bnRlciBbTlJfQ1BVU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIGxhc3RfaXJxX3N1bSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9jYWxfdCwgYWxlcnRfY291bnRlcik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBubWlfdG91Y2gpOwogCiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyAodm9pZCkKIHsKIAlpbnQgaTsKIAogCS8qCi0JICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCi0JICogc3Bpbm5pbmcgb24gbG9ja3Mgd2UgaG9sZCk6CisgCSAqIFRlbGwgb3RoZXIgQ1BVcyB0byByZXNldCB0aGVpciBhbGVydCBjb3VudGVycy4gV2UgY2Fubm90CisJICogZG8gaXQgb3Vyc2VsdmVzIGJlY2F1c2UgdGhlIGFsZXJ0IGNvdW50IGluY3JlYXNlIGlzIG5vdAorCSAqIGF0b21pYy4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQotCQlhbGVydF9jb3VudGVyW2ldID0gMDsKKwkJcGVyX2NwdShubWlfdG91Y2gsIGkpID0gMTsKIH0KIAogdm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCB1bnNpZ25lZCByZWFzb24pCiB7Ci0JaW50IHN1bSwgY3B1OworCWludCBzdW07CisJaW50IHRvdWNoZWQgPSAwOwogCi0JY3B1ID0gc2FmZV9zbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3VtID0gcmVhZF9wZGEoYXBpY190aW1lcl9pcnFzKTsKLQlpZiAobGFzdF9pcnFfc3Vtc1tjcHVdID09IHN1bSkgeworCWlmIChfX2dldF9jcHVfdmFyKG5taV90b3VjaCkpIHsKKwkJX19nZXRfY3B1X3ZhcihubWlfdG91Y2gpID0gMDsKKwkJdG91Y2hlZCA9IDE7CisJfQorCWlmICghdG91Y2hlZCAmJiBfX2dldF9jcHVfdmFyKGxhc3RfaXJxX3N1bSkgPT0gc3VtKSB7CiAJCS8qCiAJCSAqIEF5aWVlLCBsb29rcyBsaWtlIHRoaXMgQ1BVIGlzIHN0dWNrIC4uLgogCQkgKiB3YWl0IGEgZmV3IElSUXMgKDUgc2Vjb25kcykgYmVmb3JlIGRvaW5nIHRoZSBvb3BzIC4uLgogCQkgKi8KLQkJYWxlcnRfY291bnRlcltjcHVdKys7Ci0JCWlmIChhbGVydF9jb3VudGVyW2NwdV0gPT0gNSpubWlfaHopIHsKKwkJbG9jYWxfaW5jKCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKTsKKwkJaWYgKGxvY2FsX3JlYWQoJl9fZ2V0X2NwdV92YXIoYWxlcnRfY291bnRlcikpID09IDUqbm1pX2h6KSB7CiAJCQlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCiAJCQkJCQkJPT0gTk9USUZZX1NUT1ApIHsKLQkJCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOyAKKwkJCQlsb2NhbF9zZXQoJl9fZ2V0X2NwdV92YXIoYWxlcnRfY291bnRlciksIDApOwogCQkJCXJldHVybjsKIAkJCX0gCiAJCQlkaWVfbm1pKCJOTUkgV2F0Y2hkb2cgZGV0ZWN0ZWQgTE9DS1VQIG9uIENQVSVkIiwgcmVncyk7CiAJCX0KIAl9IGVsc2UgewotCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07Ci0JCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJCV9fZ2V0X2NwdV92YXIobGFzdF9pcnFfc3VtKSA9IHN1bTsKKwkJbG9jYWxfc2V0KCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpLCAwKTsKIAl9Ci0JaWYgKG5taV9wZXJmY3RyX21zcikKKwlpZiAobm1pX3BlcmZjdHJfbXNyKSB7CisgCQlpZiAobm1pX3BlcmZjdHJfbXNyID09IE1TUl9QNF9JUV9DT1VOVEVSMCkgeworIAkJCS8qCisgCQkJICogUDQgcXVpcmtzOgorIAkJCSAqIC0gQW4gb3ZlcmZsb3duIHBlcmZjdHIgd2lsbCBhc3NlcnQgaXRzIGludGVycnVwdAorIAkJCSAqICAgdW50aWwgdGhlIE9WRiBmbGFnIGluIGl0cyBDQ0NSIGlzIGNsZWFyZWQuCisgCQkJICogLSBMVlRQQyBpcyBtYXNrZWQgb24gaW50ZXJydXB0IGFuZCBtdXN0IGJlCisgCQkJICogICB1bm1hc2tlZCBieSB0aGUgTFZUUEMgaGFuZGxlci4KKyAJCQkgKi8KKyAJCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIG5taV9wNF9jY2NyX3ZhbCwgMCk7CisgCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisgCQl9CiAJCXdybXNyKG5taV9wZXJmY3RyX21zciwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgLTEpOworCX0KIH0KIAogc3RhdGljIGludCBkdW1teV9ubWlfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViNWYxMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIFBvcnRlZCBvdmVyIGZyb20gaTM4NiBieSBBSywgb3JpZ2luYWwgY29weXJpZ2h0IHdhczoKKyAqCisgKiAoQykgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiAyMDAzCisgKgorICogRHJpdmVyIHRvIHVzZSB0aGUgUG93ZXIgTWFuYWdlbWVudCBUaW1lciAoUE1UTVIpIGF2YWlsYWJsZSBpbiBzb21lCisgKiBzb3V0aGJyaWRnZXMgYXMgcHJpbWFyeSB0aW1pbmcgc291cmNlIGZvciB0aGUgTGludXgga2VybmVsLgorICoKKyAqIEJhc2VkIG9uIHBhcnRzIG9mIGxpbnV4L2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMsIHRpbWVyX3BpdC5jLAorICogdGltZXJfaHBldC5jLCBhbmQgb24gQXJqYW4gdmFuIGRlIFZlbidzIGltcGxlbWVudGF0aW9uIGZvciAyLjQuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIuCisgKgorICogRHJvcHBlZCBhbGwgdGhlIGhhcmR3YXJlIGJ1ZyB3b3JrYXJvdW5kcyBmb3Igbm93LiBIb3BlZnVsbHkgdGhleQorICogYXJlIG5vdCBuZWVkZWQgb24gNjRiaXQgY2hpcHNldHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CisKKy8qIFRoZSBJL08gcG9ydCB0aGUgUE1UTVIgcmVzaWRlcyBhdC4KKyAqIFRoZSBsb2NhdGlvbiBpcyBkZXRlY3RlZCBkdXJpbmcgc2V0dXBfYXJjaCgpLAorICogaW4gYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyAqLwordTMyIHBtdG1yX2lvcG9ydDsKKworLyogdmFsdWUgb2YgdGhlIFBvd2VyIHRpbWVyIGF0IGxhc3QgdGltZXIgaW50ZXJydXB0ICovCitzdGF0aWMgdTMyIG9mZnNldF9kZWxheTsKK3N0YXRpYyB1MzIgbGFzdF9wbXRtcl90aWNrOworCisjZGVmaW5lIEFDUElfUE1fTUFTSyAweEZGRkZGRiAvKiBsaW1pdCBpdCB0byAyNCBiaXRzICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIGN5YzJ1cyh1MzIgY3ljbGVzKQoreworCS8qIFRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIHRpY2tzIGF0IDMuNTc5NTQ1IHRpY2tzIHBlciBtaWNyb3NlY29uZC4KKwkgKiAxIC8gUE1fVElNRVJfRlJFUVVFTkNZID09IDAuMjc5MzY1MTEgPX4gMjg2LzEwMjQgW2Vycm9yOiAwLjAyNCVdCisJICoKKwkgKiBFdmVuIHdpdGggSFogPSAxMDAsIGRlbHRhIGlzIGF0IG1heGltdW0gMzU3OTYgdGlja3MsIHNvIGl0IGNhbgorCSAqIGVhc2lseSBiZSBtdWx0aXBsaWVkIHdpdGggMjg2ICg9MHgxMUUpIHdpdGhvdXQgaGF2aW5nIHRvIGZlYXIKKwkgKiB1MzIgb3ZlcmZsb3dzLgorCSAqLworCWN5Y2xlcyAqPSAyODY7CisJcmV0dXJuIChjeWNsZXMgPj4gMTApOworfQorCitpbnQgcG10aW1lcl9tYXJrX29mZnNldCh2b2lkKQoreworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKKwl1bnNpZ25lZCBsb25nIHRzYzsKKwl1MzIgbG9zdDsKKworCXUzMiB0aWNrID0gaW5sKHBtdG1yX2lvcG9ydCk7CisJdTMyIGRlbHRhOworCisJZGVsdGEgPSBjeWMydXMoKHRpY2sgLSBsYXN0X3BtdG1yX3RpY2spICYgQUNQSV9QTV9NQVNLKTsKKworCWxhc3RfcG10bXJfdGljayA9IHRpY2s7CisJbW9ub3RvbmljX2Jhc2UgKz0gZGVsdGEgKiBOU0VDX1BFUl9VU0VDOworCisJZGVsdGEgKz0gb2Zmc2V0X2RlbGF5OworCisJbG9zdCA9IGRlbHRhIC8gKFVTRUNfUEVSX1NFQyAvIEhaKTsKKwlvZmZzZXRfZGVsYXkgPSBkZWx0YSAlIChVU0VDX1BFUl9TRUMgLyBIWik7CisKKwlyZHRzY2xsKHRzYyk7CisJdnh0aW1lLmxhc3RfdHNjID0gdHNjIC0gb2Zmc2V0X2RlbGF5ICogY3B1X2toejsKKworCS8qIGRvbid0IGNhbGN1bGF0ZSBkZWxheSBmb3IgZmlyc3QgcnVuLAorCSAgIG9yIGlmIHdlJ3ZlIGdvdCBsZXNzIHRoZW4gYSB0aWNrICovCisJaWYgKGZpcnN0X3J1biB8fCAobG9zdCA8IDEpKSB7CisJCWZpcnN0X3J1biA9IDA7CisJCW9mZnNldF9kZWxheSA9IDA7CisJfQorCisJcmV0dXJuIGxvc3QgLSAxOworfQorCit1bnNpZ25lZCBpbnQgZG9fZ2V0dGltZW9mZnNldF9wbSh2b2lkKQoreworCXUzMiBub3csIG9mZnNldCwgZGVsdGEgPSAwOworCisJb2Zmc2V0ID0gbGFzdF9wbXRtcl90aWNrOworCW5vdyA9IGlubChwbXRtcl9pb3BvcnQpOworCWRlbHRhID0gKG5vdyAtIG9mZnNldCkgJiBBQ1BJX1BNX01BU0s7CisKKwlyZXR1cm4gb2Zmc2V0X2RlbGF5ICsgY3ljMnVzKGRlbHRhKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBub3BtdGltZXJfc2V0dXAoY2hhciAqcykKK3sKKwlwbXRtcl9pb3BvcnQgPSAwOworCXJldHVybiAwOworfQorCitfX3NldHVwKCJub3BtdGltZXIiLCBub3BtdGltZXJfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IGUyNmU4NmIuLjUyNWY2YTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTI1NywxMyArMjU3LDEzIEBACiAJCQl2YWx1ZSAmPSAweGZmZmY7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCxmc19iYXNlKToKLQkJCWlmICghKCh2YWx1ZSA+PiA0OCkgPT0gMCB8fCAodmFsdWUgPj4gNDgpID09IDB4ZmZmZikpCi0JCQkJcmV0dXJuIC1FSU87IAorCQkJaWYgKHZhbHVlID49IFRBU0tfU0laRSkKKwkJCQlyZXR1cm4gLUVJTzsKIAkJCWNoaWxkLT50aHJlYWQuZnMgPSB2YWx1ZTsKIAkJCXJldHVybiAwOwogCQljYXNlIG9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LGdzX2Jhc2UpOgotCQkJaWYgKCEoKHZhbHVlID4+IDQ4KSA9PSAwIHx8ICh2YWx1ZSA+PiA0OCkgPT0gMHhmZmZmKSkKLQkJCQlyZXR1cm4gLUVJTzsgCisJCQlpZiAodmFsdWUgPj0gVEFTS19TSVpFKQorCQkJCXJldHVybiAtRUlPOwogCQkJY2hpbGQtPnRocmVhZC5ncyA9IHZhbHVlOwogCQkJcmV0dXJuIDA7CiAJCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsIGVmbGFncyk6CkBAIC0yNzcsNiArMjc3LDExIEBACiAJCQkJcmV0dXJuIC1FSU87CiAJCQl2YWx1ZSAmPSAweGZmZmY7CiAJCQlicmVhazsKKwkJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwgcmlwKToKKwkJCS8qIENoZWNrIGlmIHRoZSBuZXcgUklQIGFkZHJlc3MgaXMgY2Fub25pY2FsICovCisJCQlpZiAodmFsdWUgPj0gVEFTS19TSVpFKQorCQkJCXJldHVybiAtRUlPOworCQkJYnJlYWs7CiAJfQogCXB1dF9zdGFja19sb25nKGNoaWxkLCByZWdubyAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksIHZhbHVlKTsKIAlyZXR1cm4gMDsKQEAgLTM3NSw3ICszODAsNyBAQAogCQkJYnJlYWs7CiAKIAkJc3dpdGNoIChhZGRyKSB7IAotCQljYXNlIDAgLi4uIHNpemVvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCk6CisJCWNhc2UgMCAuLi4gc2l6ZW9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAtIHNpemVvZihsb25nKToKIAkJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CiAJCQlicmVhazsKIAkJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk6CkBAIC00MjAsNyArNDI1LDcgQEAKIAkJCWJyZWFrOwogCiAJCXN3aXRjaCAoYWRkcikgeyAKLQkJY2FzZSAwIC4uLiBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpOiAKKwkJY2FzZSAwIC4uLiBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpIC0gc2l6ZW9mKGxvbmcpOgogCQkJcmV0ID0gcHV0cmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCQkvKiBEaXNhbGxvd3MgdG8gc2V0IGEgYnJlYWtwb2ludCBpbnRvIHRoZSB2c3lzY2FsbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwppbmRleCAyMTI5Y2Y5Li45OWYwMzhlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwpAQCAtNzE5LDcgKzcxOSw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1NNUAogLyoKICAqIE9uIGEgQU1EIGR1YWwgY29yZSBzZXR1cCB0aGUgbG93ZXIgYml0cyBvZiB0aGUgQVBJQyBpZCBkaXN0aW5ndXNoIHRoZSBjb3Jlcy4KICAqIEFzc3VtZXMgbnVtYmVyIG9mIGNvcmVzIGlzIGEgcG93ZXIgb2YgdHdvLgpAQCAtNzI3LDE3ICs3MjYsMjYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhbWRfZGV0ZWN0X2NtcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCWludCBjcHUgPSBjLT54ODZfYXBpY2lkOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IG5vZGUgPSAwOworCXVuc2lnbmVkIGJpdHM7CiAJaWYgKGMtPng4Nl9udW1fY29yZXMgPT0gMSkKIAkJcmV0dXJuOwotCWNwdV9jb3JlX2lkW2NwdV0gPSBjcHUgPj4gaHdlaWdodDMyKGMtPng4Nl9udW1fY29yZXMgLSAxKTsKKworCWJpdHMgPSAwOworCXdoaWxlICgoMSA8PCBiaXRzKSA8IGMtPng4Nl9udW1fY29yZXMpCisJCWJpdHMrKzsKKworCS8qIExvdyBvcmRlciBiaXRzIGRlZmluZSB0aGUgY29yZSBpZCAoaW5kZXggb2YgY29yZSBpbiBzb2NrZXQpICovCisJY3B1X2NvcmVfaWRbY3B1XSA9IHBoeXNfcHJvY19pZFtjcHVdICYgKCgxIDw8IGJpdHMpLTEpOworCS8qIENvbnZlcnQgdGhlIEFQSUMgSUQgaW50byB0aGUgc29ja2V0IElEICovCisJcGh5c19wcm9jX2lkW2NwdV0gPj49IGJpdHM7CiAKICNpZmRlZiBDT05GSUdfTlVNQQogCS8qIFdoZW4gYW4gQUNQSSBTUkFUIHRhYmxlIGlzIGF2YWlsYWJsZSB1c2UgdGhlIG1hcHBpbmdzIGZyb20gU1JBVAogIAkgICBpbnN0ZWFkLiAqLwogCWlmIChhY3BpX251bWEgPD0gMCkgewotCQlub2RlID0gY3B1X2NvcmVfaWRbY3B1XTsKKwkJbm9kZSA9IHBoeXNfcHJvY19pZFtjcHVdOwogCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQogCQkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKIAkJY3B1X3RvX25vZGVbY3B1XSA9IG5vZGU7CkBAIC03NDUsMTUgKzc1MywxMSBAQAogCQlub2RlID0gY3B1X3RvX25vZGVbY3B1XTsKIAl9CiAjZW5kaWYKKwogCXByaW50ayhLRVJOX0lORk8gIkNQVSAlZCglZCkgLT4gTm9kZSAlZCAtPiBDb3JlICVkXG4iLAogCQkJY3B1LCBjLT54ODZfbnVtX2NvcmVzLCBub2RlLCBjcHVfY29yZV9pZFtjcHVdKTsKICNlbmRpZgogfQotI2Vsc2UKLXN0YXRpYyB2b2lkIF9faW5pdCBhbWRfZGV0ZWN0X2NtcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci19Ci0jZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewpAQCAtOTI1LDcgKzkyOSw2IEBACiAJYy0+eDg2X2NsZmx1c2hfc2l6ZSA9IDY0OwogCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSBjLT54ODZfY2xmbHVzaF9zaXplOwogCWMtPng4Nl9udW1fY29yZXMgPSAxOwotCWMtPng4Nl9hcGljaWQgPSBjID09ICZib290X2NwdV9kYXRhID8gMCA6IGMgLSBjcHVfZGF0YTsKIAljLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA9IDA7CiAJbWVtc2V0KCZjLT54ODZfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mIGMtPng4Nl9jYXBhYmlsaXR5KTsKIApAQCAtOTU0LDExICs5NTcsMTQgQEAKIAkJfSAKIAkJaWYgKGMtPng4Nl9jYXBhYmlsaXR5WzBdICYgKDE8PDE5KSkgCiAJCQljLT54ODZfY2xmbHVzaF9zaXplID0gKChtaXNjID4+IDgpICYgMHhmZikgKiA4OwotCQljLT54ODZfYXBpY2lkID0gbWlzYyA+PiAyNDsKIAl9IGVsc2UgewogCQkvKiBIYXZlIENQVUlEIGxldmVsIDAgb25seSAtIHVuaGVhcmQgb2YgKi8KIAkJYy0+eDg2ID0gNDsKIAl9CisKKyNpZmRlZiBDT05GSUdfU01QCisJcGh5c19wcm9jX2lkW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSAoY3B1aWRfZWJ4KDEpID4+IDI0KSAmIDB4ZmY7CisjZW5kaWYKIH0KIAogLyoKQEAgLTEwODgsNyArMTA5NCw3IEBACiAJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKIAkJLyogT3RoZXIgKExpbnV4LWRlZmluZWQpICovCi0JCSJjeG1teCIsIE5VTEwsICJjeXJpeF9hcnIiLCAiY2VudGF1cl9tY3IiLCAiazhjKyIsCisJCSJjeG1teCIsIE5VTEwsICJjeXJpeF9hcnIiLCAiY2VudGF1cl9tY3IiLCBOVUxMLAogCQkiY29uc3RhbnRfdHNjIiwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zaWduYWwuYwppbmRleCBkNDM5Y2VkLi4zZmRjZGJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jCkBAIC00NTIsNyArNDUyLDkgQEAKIAkJCXJlZ3MtPnJpcCAtPSAyOwogCQl9CiAJCWlmIChyZWdzLT5yYXggPT0gKHVuc2lnbmVkIGxvbmcpLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgewotCQkJcmVncy0+cmF4ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQlyZWdzLT5yYXggPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/CisJCQkJCV9fTlJfaWEzMl9yZXN0YXJ0X3N5c2NhbGwgOgorCQkJCQlfX05SX3Jlc3RhcnRfc3lzY2FsbDsKIAkJCXJlZ3MtPnJpcCAtPSAyOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggNzNmN2U4Yi4uZjFlYzBmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogLyogQ2hhbmdlIGZvciByZWFsIENQVSBob3RwbHVnLiBOb3RlIG90aGVyIGZpbGVzIG5lZWQgdG8gYmUgZml4ZWQKICAgIGZpcnN0IHRvby4gKi8KQEAgLTkzLDYgKzk0LDcgQEAKIAogY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworRVhQT1JUX1NZTUJPTChjcHVfY29yZV9tYXApOwogCiAvKgogICogVHJhbXBvbGluZSA4MHg4NiBwcm9ncmFtIGFzIGFuIGFycmF5LgpAQCAtMTI1LDk3ICsxMjcsMjExIEBACiAKIAkqYyA9IGJvb3RfY3B1X2RhdGE7CiAJaWRlbnRpZnlfY3B1KGMpOworCXByaW50X2NwdV9pbmZvKGMpOwogfQogCiAvKgotICogU3luY2hyb25pemUgVFNDcyBvZiBDUFVzCisgKiBOZXcgRnVua3kgVFNDIHN5bmMgYWxnb3JpdGhtIGJvcnJvd2VkIGZyb20gSUE2NC4KKyAqIE1haW4gYWR2YW50YWdlIGlzIHRoYXQgaXQgZG9lc24ndCByZXNldCB0aGUgVFNDcyBmdWxseSBhbmQKKyAqIGluIGdlbmVyYWwgbG9va3MgbW9yZSByb2J1c3QgYW5kIGl0IHdvcmtzIGJldHRlciB0aGFuIG15IGVhcmxpZXIKKyAqIGF0dGVtcHRzLiBJIGJlbGlldmUgaXQgd2FzIHdyaXR0ZW4gYnkgRGF2aWQgTW9zYmVyZ2VyLiBTb21lIG1pbm9yCisgKiBhZGp1c3RtZW50cyBmb3IgeDg2LTY0IGJ5IG1lIC1BSwogICoKLSAqIFRoaXMgbmV3IGFsZ29yaXRobSBpcyBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG9sZCAiemVybyBUU0NzIgotICogb25lLCBidXQgd2UgY2Fubm90IHplcm8gVFNDcyBhbnltb3JlIGluIHRoZSBuZXcgaG90cGx1ZyBDUFUKLSAqIG1vZGVsLgorICogT3JpZ2luYWwgY29tbWVudCByZXByb2R1Y2VkIGJlbG93LgorICoKKyAqIFN5bmNocm9uaXplIFRTQyBvZiB0aGUgY3VycmVudCAoc2xhdmUpIENQVSB3aXRoIHRoZSBUU0Mgb2YgdGhlCisgKiBNQVNURVIgQ1BVIChub3JtYWxseSB0aGUgdGltZS1rZWVwZXIgQ1BVKS4gIFdlIHVzZSBhIGNsb3NlZCBsb29wIHRvCisgKiBlbGltaW5hdGUgdGhlIHBvc3NpYmlsaXR5IG9mIHVuYWNjb3VudGVkLWZvciBlcnJvcnMgKHN1Y2ggYXMKKyAqIGdldHRpbmcgYSBtYWNoaW5lIGNoZWNrIGluIHRoZSBtaWRkbGUgb2YgYSBjYWxpYnJhdGlvbiBzdGVwKS4gIFRoZQorICogYmFzaWMgaWRlYSBpcyBmb3IgdGhlIHNsYXZlIHRvIGFzayB0aGUgbWFzdGVyIHdoYXQgaXRjIHZhbHVlIGl0IGhhcworICogYW5kIHRvIHJlYWQgaXRzIG93biBpdGMgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWFzdGVyIHJlc3BvbmRzLiAgRWFjaAorICogaXRlcmF0aW9uIGdpdmVzIHVzIHRocmVlIHRpbWVzdGFtcHM6CisgKgorICoJc2xhdmUJCW1hc3RlcgorICoKKyAqCXQwIC0tLVwKKyAqICAgICAgICAgICAgIC0tLVwKKyAqCQkgICAtLS0+CisgKgkJCXRtCisgKgkJICAgLy0tLQorICoJICAgICAgIC8tLS0KKyAqCXQxIDwtLS0KKyAqCisgKgorICogVGhlIGdvYWwgaXMgdG8gYWRqdXN0IHRoZSBzbGF2ZSdzIFRTQyBzdWNoIHRoYXQgdG0gZmFsbHMgZXhhY3RseQorICogaGFsZi13YXkgYmV0d2VlbiB0MCBhbmQgdDEuICBJZiB3ZSBhY2hpZXZlIHRoaXMsIHRoZSBjbG9ja3MgYXJlCisgKiBzeW5jaHJvbml6ZWQgcHJvdmlkZWQgdGhlIGludGVyY29ubmVjdCBiZXR3ZWVuIHRoZSBzbGF2ZSBhbmQgdGhlCisgKiBtYXN0ZXIgaXMgc3ltbWV0cmljLiAgRXZlbiBpZiB0aGUgaW50ZXJjb25uZWN0IHdlcmUgYXN5bW1ldHJpYywgd2UKKyAqIHdvdWxkIHN0aWxsIGtub3cgdGhhdCB0aGUgc3luY2hyb25pemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAqIHJvdW5kdHJpcCBsYXRlbmN5ICh0MCAtIHQxKS4KKyAqCisgKiBXaGVuIHRoZSBpbnRlcmNvbm5lY3QgaXMgcXVpZXQgYW5kIHN5bW1ldHJpYywgdGhpcyBsZXRzIHVzCisgKiBzeW5jaHJvbml6ZSB0aGUgVFNDIHRvIHdpdGhpbiBvbmUgb3IgdHdvIGN5Y2xlcy4gIEhvd2V2ZXIsIHdlIGNhbgorICogb25seSAqZ3VhcmFudGVlKiB0aGF0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgYWNjdXJhdGUgdG8gd2l0aGluIGEKKyAqIHJvdW5kLXRyaXAgdGltZSwgd2hpY2ggaXMgdHlwaWNhbGx5IGluIHRoZSByYW5nZSBvZiBzZXZlcmFsIGh1bmRyZWQKKyAqIGN5Y2xlcyAoZS5nLiwgfjUwMCBjeWNsZXMpLiAgSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCB0aGUgVFNDcworICogYXJlIHVzdWFsbHkgYWxtb3N0IHBlcmZlY3RseSBzeW5jaHJvbml6ZWQsIGJ1dCB3ZSBzaG91bGRuJ3QgYXNzdW1lCisgKiB0aGF0IHRoZSBhY2N1cmFjeSBpcyBtdWNoIGJldHRlciB0aGFuIGhhbGYgYSBtaWNybyBzZWNvbmQgb3Igc28uCisgKgorICogW3RoZXJlIGFyZSBvdGhlciBlcnJvcnMgbGlrZSB0aGUgbGF0ZW5jeSBvZiBSRFRTQyBhbmQgb2YgdGhlCisgKiBXUk1TUi4gVGhlc2UgY2FuIGFsc28gYWNjb3VudCB0byBodW5kcmVkcyBvZiBjeWNsZXMuIFNvIGl0J3MKKyAqIHByb2JhYmx5IHdvcnNlLiBJdCBjbGFpbXMgMTUzIGN5Y2xlcyBlcnJvciBvbiBhIGR1YWwgT3B0ZXJvbiwKKyAqIGJ1dCBJIHN1c3BlY3QgdGhlIG51bWJlcnMgYXJlIGFjdHVhbGx5IHNvbWV3aGF0IHdvcnNlIC1BS10KICAqLwogCi1zdGF0aWMgYXRvbWljX3QgX19jcHVpbml0ZGF0YSB0c2NfZmxhZzsKKyNkZWZpbmUgTUFTVEVSCTAKKyNkZWZpbmUgU0xBVkUJKFNNUF9DQUNIRV9CWVRFUy84KQorCisvKiBJbnRlbnRpb25hbGx5IGRvbid0IHVzZSBjcHVfcmVsYXgoKSB3aGlsZSBUU0Mgc3luY2hyb25pemF0aW9uCisgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZ28gaW50byBmdW5reSBwb3dlciBzYXZlIG1vZGkgb3IgY2F1c2UKKyAgIGh5cGVydmlzb3JzIHRvIHNjaGVkdWxlIHVzIGF3YXkuICBHb2luZyB0byBzbGVlcCB3b3VsZCBsaWtlbHkgYWZmZWN0CisgICBsYXRlbmN5IGFuZCBsb3cgbGF0ZW5jeSBpcyB0aGUgcHJpbWFyeSBvYmplY3RpdmUgaGVyZS4gLUFLICovCisjZGVmaW5lIG5vX2NwdV9yZWxheCgpIGJhcnJpZXIoKQorCiBzdGF0aWMgX19jcHVpbml0ZGF0YSBERUZJTkVfU1BJTkxPQ0sodHNjX3N5bmNfbG9jayk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9fY3B1aW5pdGRhdGEgYnBfdHNjLCBhcF90c2M7CitzdGF0aWMgdm9sYXRpbGUgX19jcHVpbml0ZGF0YSB1bnNpZ25lZCBsb25nIGdvW1NMQVZFICsgMV07CitzdGF0aWMgaW50IG5vdHNjc3luYyBfX2NwdWluaXRkYXRhOwogCi0jZGVmaW5lIE5SX0xPT1BTIDUKKyN1bmRlZiBERUJVR19UU0NfU1lOQwogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgc3luY190c2NfYnBfaW5pdChpbnQgaW5pdCkKKyNkZWZpbmUgTlVNX1JPVU5EUwk2NAkvKiBtYWdpYyB2YWx1ZSAqLworI2RlZmluZSBOVU1fSVRFUlMJNQkvKiBsaWtld2lzZSAqLworCisvKiBDYWxsYmFjayBvbiBib290IENQVSAqLworc3RhdGljIF9fY3B1aW5pdCB2b2lkIHN5bmNfbWFzdGVyKHZvaWQgKmFyZykKIHsKLQlpZiAoaW5pdCkKLQkJX3Jhd19zcGluX2xvY2soJnRzY19zeW5jX2xvY2spOwotCWVsc2UKLQkJX3Jhd19zcGluX3VubG9jaygmdHNjX3N5bmNfbG9jayk7Ci0JYXRvbWljX3NldCgmdHNjX2ZsYWcsIDApOwotfQorCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7CiAKLS8qCi0gKiBTeW5jaHJvbml6ZSBUU0Mgb24gQVAgd2l0aCBCUC4KLSAqLwotc3RhdGljIHZvaWQgX19jcHVpbml0IF9fc3luY190c2NfYXAodm9pZCkKLXsKLQlpZiAoIWNwdV9oYXNfdHNjKQotCQlyZXR1cm47Ci0JRHByaW50aygiQVAgJWQgc3luY2luZyBUU0NcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19mbGFnKSAhPSAwKQotCQljcHVfcmVsYXgoKTsKLQlhdG9taWNfaW5jKCZ0c2NfZmxhZyk7Ci0JbWIoKTsKLQlfcmF3X3NwaW5fbG9jaygmdHNjX3N5bmNfbG9jayk7Ci0Jd3Jtc3JsKE1TUl9JQTMyX1RTQywgYnBfdHNjKTsKLQlfcmF3X3NwaW5fdW5sb2NrKCZ0c2Nfc3luY19sb2NrKTsKLQlyZHRzY2xsKGFwX3RzYyk7Ci0JbWIoKTsKLQlhdG9taWNfaW5jKCZ0c2NfZmxhZyk7Ci0JbWIoKTsKLX0KLQotc3RhdGljIHZvaWQgX19jcHVpbml0IHN5bmNfdHNjX2FwKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspCi0JCV9fc3luY190c2NfYXAoKTsKLX0KLQotLyoKLSAqIFN5bmNocm9uaXplIFRTQyBmcm9tIEJQIHRvIEFQLgotICovCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgX19zeW5jX3RzY19icChpbnQgY3B1KQotewotCWlmICghY3B1X2hhc190c2MpCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBib290X2NwdV9pZCkKIAkJcmV0dXJuOwogCi0JLyogV2FpdCBmb3IgQVAgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19mbGFnKSA9PSAwKQotCQljcHVfcmVsYXgoKTsKLQkvKiBTYXZlIEJQcyBUU0MgKi8KLQlzeW5jX2NvcmUoKTsKLQlyZHRzY2xsKGJwX3RzYyk7Ci0JLyogRG9uJ3QgZG8gdGhlIHN5bmMgY29yZSBoZXJlIHRvIGF2b2lkIHRvbyBtdWNoIGxhdGVuY3kuICovCi0JbWIoKTsKLQkvKiBTdGFydCB0aGUgQVAgKi8KLQlfcmF3X3NwaW5fdW5sb2NrKCZ0c2Nfc3luY19sb2NrKTsKLQkvKiBXYWl0IGZvciBBUCBhZ2FpbiAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2ZsYWcpIDwgMikKLQkJY3B1X3JlbGF4KCk7Ci0JcmR0c2NsKGJwX3RzYyk7Ci0JYmFycmllcigpOwotfQorCWdvW01BU1RFUl0gPSAwOwogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgc3luY190c2NfYnAoaW50IGNwdSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTlJfTE9PUFMgLSAxOyBpKyspIHsKLQkJX19zeW5jX3RzY19icChjcHUpOwotCQlzeW5jX3RzY19icF9pbml0KDEpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fUk9VTkRTKk5VTV9JVEVSUzsgKytpKSB7CisJCQl3aGlsZSAoIWdvW01BU1RFUl0pCisJCQkJbm9fY3B1X3JlbGF4KCk7CisJCQlnb1tNQVNURVJdID0gMDsKKwkJCXJkdHNjbGwoZ29bU0xBVkVdKTsKKwkJfQogCX0KLQlfX3N5bmNfdHNjX2JwKGNwdSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU3luY2VkIFRTQyBvZiBDUFUgJWQgZGlmZmVyZW5jZSAlTGRcbiIsCi0JICAgICAgIGNwdSwgYXBfdHNjIC0gYnBfdHNjKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjeWNsZXMgYnkgd2hpY2ggb3VyIHRzYyBkaWZmZXJzIGZyb20gdGhlIHRzYworICogb24gdGhlIG1hc3RlciAodGltZS1rZWVwZXIpIENQVS4gIEEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRlcyBvdXIKKyAqIHRzYyBpcyBhaGVhZCBvZiB0aGUgbWFzdGVyLCBuZWdhdGl2ZSB0aGF0IGl0IGlzIGJlaGluZC4KKyAqLworc3RhdGljIGlubGluZSBsb25nCitnZXRfZGVsdGEobG9uZyAqcnQsIGxvbmcgKm1hc3RlcikKK3sKKwl1bnNpZ25lZCBsb25nIGJlc3RfdDAgPSAwLCBiZXN0X3QxID0gfjBVTCwgYmVzdF90bSA9IDA7CisJdW5zaWduZWQgbG9uZyB0Y2VudGVyLCB0MCwgdDEsIHRtOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9JVEVSUzsgKytpKSB7CisJCXJkdHNjbGwodDApOworCQlnb1tNQVNURVJdID0gMTsKKwkJd2hpbGUgKCEodG0gPSBnb1tTTEFWRV0pKQorCQkJbm9fY3B1X3JlbGF4KCk7CisJCWdvW1NMQVZFXSA9IDA7CisJCXJkdHNjbGwodDEpOworCisJCWlmICh0MSAtIHQwIDwgYmVzdF90MSAtIGJlc3RfdDApCisJCQliZXN0X3QwID0gdDAsIGJlc3RfdDEgPSB0MSwgYmVzdF90bSA9IHRtOworCX0KKworCSpydCA9IGJlc3RfdDEgLSBiZXN0X3QwOworCSptYXN0ZXIgPSBiZXN0X3RtIC0gYmVzdF90MDsKKworCS8qIGF2ZXJhZ2UgYmVzdF90MCBhbmQgYmVzdF90MSB3aXRob3V0IG92ZXJmbG93OiAqLworCXRjZW50ZXIgPSAoYmVzdF90MC8yICsgYmVzdF90MS8yKTsKKwlpZiAoYmVzdF90MCAlIDIgKyBiZXN0X3QxICUgMiA9PSAyKQorCQkrK3RjZW50ZXI7CisJcmV0dXJuIHRjZW50ZXIgLSBiZXN0X3RtOworfQorCitzdGF0aWMgX19jcHVpbml0IHZvaWQgc3luY190c2Modm9pZCkKK3sKKwlpbnQgaSwgZG9uZSA9IDA7CisJbG9uZyBkZWx0YSwgYWRqLCBhZGp1c3RfbGF0ZW5jeSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncywgcnQsIG1hc3Rlcl90aW1lX3N0YW1wLCBib3VuZDsKKyNpZiBERUJVR19UU0NfU1lOQworCXN0YXRpYyBzdHJ1Y3Qgc3luY2RlYnVnIHsKKwkJbG9uZyBydDsJLyogcm91bmR0cmlwIHRpbWUgKi8KKwkJbG9uZyBtYXN0ZXI7CS8qIG1hc3RlcidzIHRpbWVzdGFtcCAqLworCQlsb25nIGRpZmY7CS8qIGRpZmZlcmVuY2UgYmV0d2VlbiBtaWRwb2ludCBhbmQgbWFzdGVyJ3MgdGltZXN0YW1wICovCisJCWxvbmcgbGF0OwkvKiBlc3RpbWF0ZSBvZiB0c2MgYWRqdXN0bWVudCBsYXRlbmN5ICovCisJfSB0W05VTV9ST1VORFNdIF9fY3B1aW5pdGRhdGE7CisjZW5kaWYKKworCWdvW01BU1RFUl0gPSAxOworCisJc21wX2NhbGxfZnVuY3Rpb24oc3luY19tYXN0ZXIsIE5VTEwsIDEsIDApOworCisJd2hpbGUgKGdvW01BU1RFUl0pCS8qIHdhaXQgZm9yIG1hc3RlciB0byBiZSByZWFkeSAqLworCQlub19jcHVfcmVsYXgoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0c2Nfc3luY19sb2NrLCBmbGFncyk7CisJeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JPVU5EUzsgKytpKSB7CisJCQlkZWx0YSA9IGdldF9kZWx0YSgmcnQsICZtYXN0ZXJfdGltZV9zdGFtcCk7CisJCQlpZiAoZGVsdGEgPT0gMCkgeworCQkJCWRvbmUgPSAxOwkvKiBsZXQncyBsb2NrIG9uIHRvIHRoaXMuLi4gKi8KKwkJCQlib3VuZCA9IHJ0OworCQkJfQorCisJCQlpZiAoIWRvbmUpIHsKKwkJCQl1bnNpZ25lZCBsb25nIHQ7CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCWFkanVzdF9sYXRlbmN5ICs9IC1kZWx0YTsKKwkJCQkJYWRqID0gLWRlbHRhICsgYWRqdXN0X2xhdGVuY3kvNDsKKwkJCQl9IGVsc2UKKwkJCQkJYWRqID0gLWRlbHRhOworCisJCQkJcmR0c2NsbCh0KTsKKwkJCQl3cm1zcmwoTVNSX0lBMzJfVFNDLCB0ICsgYWRqKTsKKwkJCX0KKyNpZiBERUJVR19UU0NfU1lOQworCQkJdFtpXS5ydCA9IHJ0OworCQkJdFtpXS5tYXN0ZXIgPSBtYXN0ZXJfdGltZV9zdGFtcDsKKwkJCXRbaV0uZGlmZiA9IGRlbHRhOworCQkJdFtpXS5sYXQgPSBhZGp1c3RfbGF0ZW5jeS80OworI2VuZGlmCisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNjX3N5bmNfbG9jaywgZmxhZ3MpOworCisjaWYgREVCVUdfVFNDX1NZTkMKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JPVU5EUzsgKytpKQorCQlwcmludGsoInJ0PSU1bGQgbWFzdGVyPSU1bGQgZGlmZj0lNWxkIGFkamxhdD0lNWxkXG4iLAorCQkgICAgICAgdFtpXS5ydCwgdFtpXS5tYXN0ZXIsIHRbaV0uZGlmZiwgdFtpXS5sYXQpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJDUFUgJWQ6IHN5bmNocm9uaXplZCBUU0Mgd2l0aCBDUFUgJXUgKGxhc3QgZGlmZiAlbGQgY3ljbGVzLCAiCisJICAgICAgICJtYXhlcnIgJWx1IGN5Y2xlcylcbiIsCisJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgYm9vdF9jcHVfaWQsIGRlbHRhLCBydCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCB0c2Nfc3luY193YWl0KHZvaWQpCit7CisJaWYgKG5vdHNjc3luYyB8fCAhY3B1X2hhc190c2MpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQ6IFN5bmNpbmcgVFNDIHRvIENQVSAldS5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCWJvb3RfY3B1X2lkKTsKKwlzeW5jX3RzYygpOworfQorCitzdGF0aWMgX19pbml0IGludCBub3RzY3N5bmNfc2V0dXAoY2hhciAqcykKK3sKKwlub3RzY3N5bmMgPSAxOworCXJldHVybiAwOworfQorX19zZXR1cCgibm90c2NzeW5jIiwgbm90c2NzeW5jX3NldHVwKTsKKwogc3RhdGljIGF0b21pY190IGluaXRfZGVhc3NlcnRlZCBfX2NwdWluaXRkYXRhOwogCiAvKgpAQCAtMzE1LDExICs0MzEsNiBAQAogCWNwdV9pbml0KCk7CiAJc21wX2NhbGxpbigpOwogCi0JLyoKLQkgKiBTeW5jaHJvbml6ZSB0aGUgVFNDIHdpdGggdGhlIEJQCi0JICovCi0Jc3luY190c2NfYXAoKTsKLQogCS8qIG90aGVyd2lzZSBnY2Mgd2lsbCBtb3ZlIHVwIHRoZSBzbXBfcHJvY2Vzc29yX2lkIGJlZm9yZSB0aGUgY3B1X2luaXQgKi8KIAliYXJyaWVyKCk7CiAKQEAgLTMzNCw3ICs0NDUsNiBAQAogCQllbmFibGVfODI1OUFfaXJxKDApOwogCX0KIAotCiAJZW5hYmxlX0FQSUNfdGltZXIoKTsKIAogCS8qCkBAIC0zNDMsNiArNDUzLDExIEBACiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAltYigpOwogCisJLyogV2FpdCBmb3IgVFNDIHN5bmMgdG8gbm90IHNjaGVkdWxlIHRoaW5ncyBiZWZvcmUuCisJICAgV2Ugc3RpbGwgcHJvY2VzcyBpbnRlcnJ1cHRzLCB3aGljaCBjb3VsZCBzZWUgYW4gaW5jb25zaXN0ZW50CisJICAgdGltZSBpbiB0aGF0IHdpbmRvdyB1bmZvcnR1bmF0ZWx5LiAqLworCXRzY19zeW5jX3dhaXQoKTsKKwogCWNwdV9pZGxlKCk7CiB9CiAKQEAgLTUzMSw3ICs2NDYsNiBAQAogCQlwcmludGsoImZhaWxlZCBmb3JrIGZvciBDUFUgJWRcbiIsIGNwdSk7CiAJCXJldHVybiBQVFJfRVJSKGlkbGUpOwogCX0KLQl4ODZfY3B1X3RvX2FwaWNpZFtjcHVdID0gYXBpY2lkOwogCiAJY3B1X3BkYVtjcHVdLnBjdXJyZW50ID0gaWRsZTsKIApAQCAtNjAwLDggKzcxNCw2IEBACiAKIAkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgewogCQkJLyogbnVtYmVyIENQVXMgbG9naWNhbGx5LCBzdGFydGluZyBmcm9tIDEgKEJTUCBpcyAwKSAqLwotCQkJRHByaW50aygiT0suXG4iKTsKLQkJCXByaW50X2NwdV9pbmZvKCZjcHVfZGF0YVtjcHVdKTsKIAkJCURwcmludGsoIkNQVSBoYXMgYm9vdGVkLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlib290X2Vycm9yID0gMTsKQEAgLTg0Miw3ICs5NTQsNiBAQAogCQkgICAgICBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpLCBib290X2NwdV9pZCk7CiAJCS8qIE9yIGNhbiB3ZSBzd2l0Y2ggYmFjayB0byBQSUMgaGVyZT8gKi8KIAl9Ci0JeDg2X2NwdV90b19hcGljaWRbMF0gPSBib290X2NwdV9pZDsKIAogCS8qCiAJICogTm93IHN0YXJ0IHRoZSBJTy1BUElDcwpAQCAtODg5LDE4ICsxMDAwLDE0IEBACiAJCXByaW50aygiX19jcHVfdXA6IGJhZCBjcHUgJWRcbiIsIGNwdSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzeW5jX3RzY19icF9pbml0KDEpOwogCiAJLyogQm9vdCBpdCEgKi8KIAllcnIgPSBkb19ib290X2NwdShjcHUsIGFwaWNpZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc3luY190c2NfYnBfaW5pdCgwKTsKIAkJRHByaW50aygiZG9fYm9vdF9jcHUgZmFpbGVkICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXN5bmNfdHNjX2JwKGNwdSk7Ci0KIAkvKiBVbmxlYXNoIHRoZSBDUFUhICovCiAJRHByaW50aygid2FpdGluZyBmb3IgY3B1ICVkXG4iLCBjcHUpOwogCkBAIC05MjMsNCArMTAzMCw2IEBACiAKIAlkZXRlY3Rfc2libGluZ3MoKTsKIAl0aW1lX2luaXRfZ3RvZCgpOworCisJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwppbmRleCAwZTNiNjBlLi43MzViNjc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjaHdhcmUuaD4JLyogZm9yIFBNIHRpbWVyIGZyZXF1ZW5jeSAqLwogI2luY2x1ZGUgPGFzbS84MjUzcGl0Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KQEAgLTM5Niw2ICszOTgsMTAgQEAKIAkJCShvZmZzZXQgLSB2eHRpbWUubGFzdCkqKE5TRUNfUEVSX1NFQy9IWikgLyBocGV0X3RpY2s7CiAKIAkJdnh0aW1lLmxhc3QgPSBvZmZzZXQ7CisjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgorCX0gZWxzZSBpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1BNVE1SKSB7CisJCWxvc3QgPSBwbXRpbWVyX21hcmtfb2Zmc2V0KCk7CisjZW5kaWYKIAl9IGVsc2UgewogCQlvZmZzZXQgPSAoKCh0c2MgLSB2eHRpbWUubGFzdF90c2MpICoKIAkJCSAgIHZ4dGltZS50c2NfcXVvdCkgPj4gMzIpIC0gKFVTRUNfUEVSX1NFQyAvIEhaKTsKQEAgLTg5OCw2ICs5MDQsMTMgQEAKIAkJCWhwZXRfcGVyaW9kOwogCQljcHVfa2h6ID0gaHBldF9jYWxpYnJhdGVfdHNjKCk7CiAJCXRpbWVuYW1lID0gIkhQRVQiOworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwl9IGVsc2UgaWYgKHBtdG1yX2lvcG9ydCkgeworCQl2eHRpbWVfaHogPSBQTV9USU1FUl9GUkVRVUVOQ1k7CisJCXRpbWVuYW1lID0gIlBNIjsKKwkJcGl0X2luaXQoKTsKKwkJY3B1X2toeiA9IHBpdF9jYWxpYnJhdGVfdHNjKCk7CisjZW5kaWYKIAl9IGVsc2UgewogCQlwaXRfaW5pdCgpOwogCQljcHVfa2h6ID0gcGl0X2NhbGlicmF0ZV90c2MoKTsKQEAgLTkyMywzNSArOTM2LDUwIEBACiB9CiAKIC8qCisgKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAorICogb3ZlciBhbGwgQ1BVcy4KKyAqLworc3RhdGljIF9faW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChvZW1fZm9yY2VfaHBldF90aW1lcigpKQorCQlyZXR1cm4gMTsKKyAJLyogSW50ZWwgc3lzdGVtcyBhcmUgbm9ybWFsbHkgYWxsIHN5bmNocm9uaXplZC4gRXhjZXB0aW9ucworIAkgICBhcmUgaGFuZGxlZCBpbiB0aGUgT0VNIGNoZWNrIGFib3ZlLiAqLworIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpCisgCQlyZXR1cm4gMDsKKyAJLyogQWxsIGluIGEgc2luZ2xlIHNvY2tldCAtIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgKi8KKyAJaWYgKGNwdXNfd2VpZ2h0KGNwdV9jb3JlX21hcFswXSkgPT0gbnVtX29ubGluZV9jcHVzKCkpCisgCQlyZXR1cm4gMDsKKyNlbmRpZgorIAkvKiBBc3N1bWUgbXVsdGkgc29ja2V0IHN5c3RlbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgKi8KKyAJcmV0dXJuIG51bV9vbmxpbmVfY3B1cygpID4gMTsKK30KKworLyoKICAqIERlY2lkZSBhZnRlciBhbGwgQ1BVcyBhcmUgYm9vdGVkIHdoYXQgbW9kZSBnZXR0aW1lb2ZkYXkgc2hvdWxkIHVzZS4KICAqLwogdm9pZCBfX2luaXQgdGltZV9pbml0X2d0b2Qodm9pZCkKIHsKIAljaGFyICp0aW1ldHlwZTsKIAotCS8qCi0JICogQU1EIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVSBkb24ndCBoYXZlIGZ1bGx5IHN5bmNocm9uaXplZAotCSAqIFRTQ3MuIEFsd2F5cyB1c2UgSFBFVCBnZXR0aW1lb2ZkYXkgZm9yIHRoZXNlLCBhbHRob3VnaCBpdCBpcyBzbG93ZXIuCi0JICogSW50ZWwgU01QIHN5c3RlbXMgdXN1YWxseSBoYXZlIHN5bmNocm9uaXplZCBUU0NzLCBzbyB1c2UgYWx3YXlzCi0JICogdGhlIFRTQy4KLQkgKgotCSAqIEV4Y2VwdGlvbnM6Ci0JICogSUJNIFN1bW1pdDIgY2hlY2tlZCBieSBvZW1fZm9yY2VfaHBldF90aW1lcigpLgotIAkgKiBBTUQgZHVhbCBjb3JlIG1heSBhbHNvIG5vdCBuZWVkIEhQRVQuIENoZWNrIG1lLgotCSAqCi0JICogQ2FuIGJlIHR1cm5lZCBvZmYgd2l0aCAibm90c2MiLgotCSAqLwotCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEgJiYKLQkgICAgYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQotCQlub3RzYyA9IDE7Ci0JLyogU29tZSBzeXN0ZW1zIHdpbGwgd2FudCB0byBkaXNhYmxlIFRTQyBhbmQgdXNlIEhQRVQuICovCi0JaWYgKG9lbV9mb3JjZV9ocGV0X3RpbWVyKCkpCisJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQogCQlub3RzYyA9IDE7CiAJaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MgJiYgbm90c2MpIHsKIAkJdGltZXR5cGUgPSAiSFBFVCI7CiAJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7CiAJCXZ4dGltZS5tb2RlID0gVlhUSU1FX0hQRVQ7CiAJCWRvX2dldHRpbWVvZmZzZXQgPSBkb19nZXR0aW1lb2Zmc2V0X2hwZXQ7CisjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgorCS8qIFVzaW5nIFBNIGZvciBnZXR0aW1lb2ZkYXkgaXMgcXVpdGUgc2xvdywgYnV0IHdlIGhhdmUgbm8gb3RoZXIKKwkgICBjaG9pY2UgYmVjYXVzZSB0aGUgVFNDIGlzIHRvbyB1bnJlbGlhYmxlIG9uIHNvbWUgc3lzdGVtcy4gKi8KKwl9IGVsc2UgaWYgKHBtdG1yX2lvcG9ydCAmJiAhdnh0aW1lLmhwZXRfYWRkcmVzcyAmJiBub3RzYykgeworCQl0aW1ldHlwZSA9ICJQTSI7CisJCWRvX2dldHRpbWVvZmZzZXQgPSBkb19nZXR0aW1lb2Zmc2V0X3BtOworCQl2eHRpbWUubW9kZSA9IFZYVElNRV9QTVRNUjsKKwkJc3lzY3RsX3ZzeXNjYWxsID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHZzeXNjYWxsIGR1ZSB0byB1c2Ugb2YgUE0gdGltZXJcbiIpOworI2VuZGlmCiAJfSBlbHNlIHsKIAkJdGltZXR5cGUgPSB2eHRpbWUuaHBldF9hZGRyZXNzID8gIkhQRVQvVFNDIiA6ICJQSVQvVFNDIjsKIAkJdnh0aW1lLm1vZGUgPSBWWFRJTUVfVFNDOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwppbmRleCA2NWEzN2Y1Li4zZGZlYzhmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwpAQCAtMzMyLDEwICszMzIsMTIgQEAKIAlwcmludGsoS0VSTl9BTEVSVCAiS2VybmVsIEJVRyBhdCAlLjUwczolZFxuIiwgZi5maWxlbmFtZSwgZi5saW5lKTsKIH0gCiAKKyNpZmRlZiBDT05GSUdfQlVHCiB2b2lkIG91dF9vZl9saW5lX2J1Zyh2b2lkKQogeyAKIAlCVUcoKTsgCiB9IAorI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwogc3RhdGljIGludCBkaWVfb3duZXIgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKaW5kZXggYjRiOGRjNS4uMmU1NzM0NCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJdXNlYyA9IChfX3h0aW1lLnR2X25zZWMgLyAxMDAwKSArCiAJCQkoX19qaWZmaWVzIC0gX193YWxsX2ppZmZpZXMpICogKDEwMDAwMDAgLyBIWik7CiAKLQkJaWYgKF9fdnh0aW1lLm1vZGUgPT0gVlhUSU1FX1RTQykgeworCQlpZiAoX192eHRpbWUubW9kZSAhPSBWWFRJTUVfSFBFVCkgewogCQkJc3luY19jb3JlKCk7CiAJCQlyZHRzY2xsKHQpOwogCQkJaWYgKHQgPCBfX3Z4dGltZS5sYXN0X3RzYykKQEAgLTIxNyw4ICsyMTcsOSBAQAogCUJVR19PTigodW5zaWduZWQgbG9uZykgJnZ0aW1lICE9IFZTWVNDQUxMX0FERFIoX19OUl92dGltZSkpOwogCUJVR19PTigoVlNZU0NBTExfQUREUigwKSAhPSBfX2ZpeF90b192aXJ0KFZTWVNDQUxMX0ZJUlNUX1BBR0UpKSk7CiAJbWFwX3ZzeXNjYWxsKCk7Ci0Jc3lzY3RsX3ZzeXNjYWxsID0gMTsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGtlcm5lbF9yb290X3RhYmxlMiwgMCk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3g4NjY0X2tzeW1zLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwppbmRleCBhNDNkZWRiLi42OGVjMDMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwpAQCAtMTkzLDggKzE5Myw5IEBACiBleHRlcm4gdm9pZCBkb19zb2Z0aXJxX3RodW5rKHZvaWQpOwogRVhQT1JUX1NZTUJPTChkb19zb2Z0aXJxX3RodW5rKTsKIAotdm9pZCBvdXRfb2ZfbGluZV9idWcodm9pZCk7CisjaWZkZWYgQ09ORklHX0JVRwogRVhQT1JUX1NZTUJPTChvdXRfb2ZfbGluZV9idWcpOworI2VuZGlmCiAKIEVYUE9SVF9TWU1CT0woaW5pdF9sZXZlbDRfcGd0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vZmF1bHQuYyBiL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKaW5kZXggZTAzMzA5Mi4uNWQ2YjIxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCkBAIC0yMzQsNiArMjM0LDggQEAKIAogLyoKICAqIEhhbmRsZSBhIGZhdWx0IG9uIHRoZSB2bWFsbG9jIG9yIG1vZHVsZSBtYXBwaW5nIGFyZWEKKyAqCisgKiBUaGlzIGFzc3VtZXMgbm8gbGFyZ2UgcGFnZXMgaW4gdGhlcmUuCiAgKi8KIHN0YXRpYyBpbnQgdm1hbGxvY19mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CkBAIC0yNzIsNyArMjc0LDEwIEBACiAJaWYgKCFwdGVfcHJlc2VudCgqcHRlX3JlZikpCiAJCXJldHVybiAtMTsKIAlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOwotCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkgfHwgcHRlX3BhZ2UoKnB0ZSkgIT0gcHRlX3BhZ2UoKnB0ZV9yZWYpKQorCS8qIERvbid0IHVzZSBwdGVfcGFnZSBoZXJlLCBiZWNhdXNlIHRoZSBtYXBwaW5ncyBjYW4gcG9pbnQKKwkgICBvdXRzaWRlIG1lbV9tYXAsIGFuZCB0aGUgTlVNQSBoYXNoIGxvb2t1cCBjYW5ub3QgaGFuZGxlCisJICAgdGhhdC4gKi8KKwlpZiAoIXB0ZV9wcmVzZW50KCpwdGUpIHx8IHB0ZV9wZm4oKnB0ZSkgIT0gcHRlX3BmbigqcHRlX3JlZikpCiAJCUJVRygpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwogCXJldHVybiAwOwpAQCAtMzQ2LDcgKzM1MSw5IEBACiAJICogcHJvdGVjdGlvbiBlcnJvciAoZXJyb3JfY29kZSAmIDEpID09IDAuCiAJICovCiAJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gVEFTS19TSVpFKSkgewotCQlpZiAoIShlcnJvcl9jb2RlICYgNSkpIHsKKwkJaWYgKCEoZXJyb3JfY29kZSAmIDUpICYmCisJCSAgICAgICgoYWRkcmVzcyA+PSBWTUFMTE9DX1NUQVJUICYmIGFkZHJlc3MgPCBWTUFMTE9DX0VORCkgfHwKKwkJICAgICAgIChhZGRyZXNzID49IE1PRFVMRVNfVkFERFIgJiYgYWRkcmVzcyA8IE1PRFVMRVNfRU5EKSkpIHsKIAkJCWlmICh2bWFsbG9jX2ZhdWx0KGFkZHJlc3MpIDwgMCkKIAkJCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vaW9yZW1hcC5jIGIvYXJjaC94ODZfNjQvbW0vaW9yZW1hcC5jCmluZGV4IDc0ZWM4NTUuLjU4YWFjMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2lvcmVtYXAuYworKysgYi9hcmNoL3g4Nl82NC9tbS9pb3JlbWFwLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWludCBlcnIgPSAwOwotCWlmIChmbGFncyAmJiBwaHlzX2FkZHIgKyBzaXplIC0gMSA8IChlbmRfcGZuX21hcCA8PCBQQUdFX1NISUZUKSkgeworCWlmIChwaHlzX2FkZHIgKyBzaXplIC0gMSA8IChlbmRfcGZuX21hcCA8PCBQQUdFX1NISUZUKSkgewogCQl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IChzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIAkJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKHBoeXNfYWRkcik7CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlyZW1vdmVfdm1fYXJlYSgodm9pZCAqKShQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZykgYWRkcikpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKGlvcmVtYXBfY2hhbmdlX2F0dHIocGh5c19hZGRyLCBzaXplLCBmbGFncykgPCAwKSB7CisJaWYgKGZsYWdzICYmIGlvcmVtYXBfY2hhbmdlX2F0dHIocGh5c19hZGRyLCBzaXplLCBmbGFncykgPCAwKSB7CiAJCWFyZWEtPmZsYWdzICY9IDB4ZmZmZmZmOwogCQl2dW5tYXAoYWRkcik7CiAJCXJldHVybiBOVUxMOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAKIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqcCwgKipwcHJldjsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpwOwogCiAJaWYgKGFkZHIgPD0gaGlnaF9tZW1vcnkpIAogCQlyZXR1cm47IApAQCAtMjYwLDI0ICsyNjAsMTEgQEAKIAkJcmV0dXJuOwogCiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCWZvciAocCA9IHZtbGlzdCwgcHByZXYgPSAmdm1saXN0OyBwICE9IE5VTEw7IHBwcmV2ID0gJnAtPm5leHQsIHAgPSAqcHByZXYpCi0JCWlmIChwLT5hZGRyID09ICh2b2lkICopKFBBR0VfTUFTSyAmICh1bnNpZ25lZCBsb25nKWFkZHIpKQotCQkJYnJlYWs7Ci0JaWYgKCFwKSB7IAotCQlwcmludGsoIl9faW91bm1hcDogYmFkIGFkZHJlc3MgJXBcbiIsIGFkZHIpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCSpwcHJldiA9IHAtPm5leHQ7Ci0JdW5tYXBfdm1fYXJlYShwKTsKLQlpZiAoKHAtPmZsYWdzID4+IDIwKSAmJgotCQlwLT5waHlzX2FkZHIgKyBwLT5zaXplIC0gMSA8IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkpIHsKLQkJLyogcC0+c2l6ZSBpbmNsdWRlcyB0aGUgZ3VhcmQgcGFnZSwgYnV0IGNwYSBkb2Vzbid0IGxpa2UgdGhhdCAqLwotCQljaGFuZ2VfcGFnZV9hdHRyKHZpcnRfdG9fcGFnZShfX3ZhKHAtPnBoeXNfYWRkcikpLAotCQkJCSBwLT5zaXplID4+IFBBR0VfU0hJRlQsCi0JCQkJIFBBR0VfS0VSTkVMKTsKLQkJZ2xvYmFsX2ZsdXNoX3RsYigpOwotCX0gCi1vdXRfdW5sb2NrOgorCXAgPSBfX3JlbW92ZV92bV9hcmVhKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgJiBQQUdFX01BU0spKTsKKwlpZiAoIXApCisJCXByaW50aygiaW91bm1hcDogYmFkIGFkZHJlc3MgJXBcbiIsIGFkZHIpOworCWVsc2UgaWYgKHAtPmZsYWdzID4+IDIwKQorCQlpb3JlbWFwX2NoYW5nZV9hdHRyKHAtPnBoeXNfYWRkciwgcC0+c2l6ZSwgMCk7CiAJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CiAJa2ZyZWUocCk7IAogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b19udWxsLmMgYi9jcnlwdG8vY3J5cHRvX251bGwuYwppbmRleCBmNjkxZDMxLi4zZmNmNmU4IDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRvX251bGwuYworKysgYi9jcnlwdG8vY3J5cHRvX251bGwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNkZWZpbmUgTlVMTF9LRVlfU0laRQkJMAogI2RlZmluZSBOVUxMX0JMT0NLX1NJWkUJCTEKQEAgLTI4LDExICsyOSwxMyBAQAogCiBzdGF0aWMgaW50IG51bGxfY29tcHJlc3Modm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17IHJldHVybiAwOyB9Ci0KLXN0YXRpYyBpbnQgbnVsbF9kZWNvbXByZXNzKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17IHJldHVybiAwOyB9Cit7CisJaWYgKHNsZW4gPiAqZGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KGRzdCwgc3JjLCBzbGVuKTsKKwkqZGxlbiA9IHNsZW47CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB2b2lkIG51bGxfaW5pdCh2b2lkICpjdHgpCiB7IH0KQEAgLTQ3LDExICs1MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogeyByZXR1cm4gMDsgfQogCi1zdGF0aWMgdm9pZCBudWxsX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoteyB9Ci0KLXN0YXRpYyB2b2lkIG51bGxfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17IH0KK3N0YXRpYyB2b2lkIG51bGxfY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgTlVMTF9CTE9DS19TSVpFKTsKK30KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNvbXByZXNzX251bGwgPSB7CiAJLmNyYV9uYW1lCQk9CSJjb21wcmVzc19udWxsIiwKQEAgLTYyLDcgKzY0LDcgQEAKIAkuY3JhX2xpc3QJCT0gICAgICAgTElTVF9IRUFEX0lOSVQoY29tcHJlc3NfbnVsbC5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7IC5jb21wcmVzcyA9IHsKIAkuY29hX2NvbXByZXNzIAkJPQludWxsX2NvbXByZXNzLAotCS5jb2FfZGVjb21wcmVzcwkJPQludWxsX2RlY29tcHJlc3MgfSB9CisJLmNvYV9kZWNvbXByZXNzCQk9CW51bGxfY29tcHJlc3MgfSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZGlnZXN0X251bGwgPSB7CkBAIC05MCw4ICs5Miw4IEBACiAJLmNpYV9taW5fa2V5c2l6ZQk9CU5VTExfS0VZX1NJWkUsCiAJLmNpYV9tYXhfa2V5c2l6ZQk9CU5VTExfS0VZX1NJWkUsCiAJLmNpYV9zZXRrZXkJCT0gCW51bGxfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkJPQludWxsX2VuY3J5cHQsCi0JLmNpYV9kZWNyeXB0CQk9CW51bGxfZGVjcnlwdCB9IH0KKwkuY2lhX2VuY3J5cHQJCT0JbnVsbF9jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JbnVsbF9jcnlwdCB9IH0KIH07CiAKIE1PRFVMRV9BTElBUygiY29tcHJlc3NfbnVsbCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCBlNjhlNDM4Li45NjRiOWE2IDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtMzgsNyArMzgsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JaWYgKCFpbl9zb2Z0aXJxKCkpCisJaWYgKCFpbl9hdG9taWMoKSkKIAkJY29uZF9yZXNjaGVkKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9NYWtlZmlsZQppbmRleCA2NjYyYjU0Li5hNDc5MjhhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmFzZS9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBkZXZpY2UgdHJlZQogCi1vYmoteQkJCTo9IGNvcmUubyBzeXMubyBpbnRlcmZhY2UubyBidXMubyBcCitvYmoteQkJCTo9IGNvcmUubyBzeXMubyBidXMubyBcCiAJCQkgICBkcml2ZXIubyBjbGFzcy5vIGNsYXNzX3NpbXBsZS5vIHBsYXRmb3JtLm8gXAogCQkJICAgY3B1Lm8gZmlybXdhcmUubyBpbml0Lm8gbWFwLm8gZG1hcG9vbC5vIFwKIAkJCSAgIGF0dHJpYnV0ZV9jb250YWluZXIubyB0cmFuc3BvcnRfY2xhc3MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDJiMzkwMmMuLjNjYjA0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTM5MCw3ICszOTAsNiBAQAogCQlzeXNmc19yZW1vdmVfbGluaygmZHJ2LT5rb2JqLCBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZHJpdmVyIik7CiAJCWxpc3RfZGVsX2luaXQoJmRldi0+ZHJpdmVyX2xpc3QpOwotCQlkZXZpY2VfZGV0YWNoX3NodXRkb3duKGRldik7CiAJCWlmIChkcnYtPnJlbW92ZSkKIAkJCWRydi0+cmVtb3ZlKGRldik7CiAJCWRldi0+ZHJpdmVyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDI2OGE5YzguLmZiYzIyMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMzEsOCArMzEsNiBAQAogI2RlZmluZSB0b19kZXYob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQogI2RlZmluZSB0b19kZXZfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cikKIAotZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGUgKiBkZXZfZGVmYXVsdF9hdHRyc1tdOwotCiBzdGF0aWMgc3NpemVfdAogZGV2X2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLCBjaGFyICogYnVmKQogewpAQCAtODksNyArODcsNiBAQAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfZGV2aWNlID0gewogCS5yZWxlYXNlCT0gZGV2aWNlX3JlbGVhc2UsCiAJLnN5c2ZzX29wcwk9ICZkZXZfc3lzZnNfb3BzLAotCS5kZWZhdWx0X2F0dHJzCT0gZGV2X2RlZmF1bHRfYXR0cnMsCiB9OwogCiAKQEAgLTI0OCw2ICsyNDUsNyBAQAogCiAJaWYgKChlcnJvciA9IGtvYmplY3RfYWRkKCZkZXYtPmtvYmopKSkKIAkJZ290byBFcnJvcjsKKwlrb2JqZWN0X2hvdHBsdWcoJmRldi0+a29iaiwgS09CSl9BREQpOwogCWlmICgoZXJyb3IgPSBkZXZpY2VfcG1fYWRkKGRldikpKQogCQlnb3RvIFBNRXJyb3I7CiAJaWYgKChlcnJvciA9IGJ1c19hZGRfZGV2aWNlKGRldikpKQpAQCAtMjYwLDE0ICsyNTgsMTMgQEAKIAkvKiBub3RpZnkgcGxhdGZvcm0gb2YgZGV2aWNlIGVudHJ5ICovCiAJaWYgKHBsYXRmb3JtX25vdGlmeSkKIAkJcGxhdGZvcm1fbm90aWZ5KGRldik7Ci0KLQlrb2JqZWN0X2hvdHBsdWcoJmRldi0+a29iaiwgS09CSl9BREQpOwogIERvbmU6CiAJcHV0X2RldmljZShkZXYpOwogCXJldHVybiBlcnJvcjsKICBCdXNFcnJvcjoKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAgUE1FcnJvcjoKKwlrb2JqZWN0X2hvdHBsdWcoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOwogIEVycm9yOgogCWlmIChwYXJlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2Jhc2UvaW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTE1ODQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9iYXNlL2ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvYmFzZS9pbnRlcmZhY2UuYyAtIGNvbW1vbiBkcml2ZXJmcyBpbnRlcmZhY2UgdGhhdCdzIGV4cG9ydGVkIHRvCi0gKiAJdGhlIHdvcmxkIGZvciBhbGwgZGV2aWNlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMyBQYXRyaWNrIE1vY2hlbAotICogQ29weXJpZ2h0IChjKSAyMDAyLTMgT3BlbiBTb3VyY2UgRGV2ZWxvcG1lbnQgTGFicwotICoKLSAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotLyoqCi0gKglkZXRhY2hfc3RhdGUgLSBjb250cm9sIHRoZSBkZWZhdWx0IHBvd2VyIHN0YXRlIGZvciB0aGUgZGV2aWNlLgotICoKLSAqCVRoaXMgaXMgdGhlIHN0YXRlIHRoZSBkZXZpY2UgZW50ZXJzIHdoZW4gaXQncyBkcml2ZXIgbW9kdWxlIGlzCi0gKgl1bmxvYWRlZC4gVGhlIHZhbHVlIGlzIGFuIHVuc2lnbmVkIGludGVnZXIsIGluIHRoZSByYW5nZSBvZiAwLTQuCi0gKgknMCcgaW5kaWNhdGVzICdPbicsIHNvIG5vIGFjdGlvbiB3aWxsIGJlIHRha2VuIHdoZW4gdGhlIGRyaXZlciBpcwotICoJdW5sb2FkZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCi0gKgknNCcgaW5kaWNhdGVzICdPZmYnLCBtZWFuaW5nIHRoZSBkcml2ZXIgY29yZSB3aWxsIGNhbGwgdGhlIGRyaXZlcidzCi0gKglzaHV0ZG93biBtZXRob2QgdG8gcXVpZXNjZSB0aGUgZGV2aWNlLgotICoJMS0zIGluZGljYXRlIGEgbG93LXBvd2VyIHN0YXRlIGZvciB0aGUgZGV2aWNlIHRvIGVudGVyIHZpYSB0aGUKLSAqCWRyaXZlcidzIHN1c3BlbmQgbWV0aG9kLgotICovCi0KLXN0YXRpYyBzc2l6ZV90IGRldGFjaF9zaG93KHN0cnVjdCBkZXZpY2UgKiBkZXYsIGNoYXIgKiBidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRldi0+ZGV0YWNoX3N0YXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGV0YWNoX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBuKQotewotCXUzMiBzdGF0ZTsKLQlzdGF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCWlmIChzdGF0ZSA+IDQpCi0JCXJldHVybiAtRUlOVkFMOwotCWRldi0+ZGV0YWNoX3N0YXRlID0gc3RhdGU7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXRhY2hfc3RhdGUsIDA2NDQsIGRldGFjaF9zaG93LCBkZXRhY2hfc3RvcmUpOwotCi0KLXN0cnVjdCBhdHRyaWJ1dGUgKiBkZXZfZGVmYXVsdF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9kZXRhY2hfc3RhdGUuYXR0ciwKLQlOVUxMLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKaW5kZXggZTVlZGE3NC4uMmU3MDBkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKQEAgLTEsMTggKzEsNyBAQAotCi0KLWVudW0gewotCURFVklDRV9QTV9PTiwKLQlERVZJQ0VfUE0xLAotCURFVklDRV9QTTIsCi0JREVWSUNFX1BNMywKLQlERVZJQ0VfUE1fT0ZGLAotfTsKLQogLyoKICAqIHNodXRkb3duLmMKICAqLwogCi1leHRlcm4gaW50IGRldmljZV9kZXRhY2hfc2h1dGRvd24oc3RydWN0IGRldmljZSAqKTsKIGV4dGVybiB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKaW5kZXggZjhmNTA1NS4uMjY0Njg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYwpAQCAtMjIsOCArMjIsMTcgQEAKIAogaW50IHJlc3VtZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqIGRldikKIHsKLQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlc3VtZSkKKwlpZiAoZGV2LT5wb3dlci5wbV9wYXJlbnQKKwkJCSYmIGRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSkgeworCQlkZXZfZXJyKGRldiwgIlBNOiByZXN1bWUgZnJvbSAlZCwgcGFyZW50ICVzIHN0aWxsICVkXG4iLAorCQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSwKKwkJCWRldi0+cG93ZXIucG1fcGFyZW50LT5idXNfaWQsCisJCQlkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUpOworCX0KKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlc3VtZSkgeworCQlkZXZfZGJnKGRldiwicmVzdW1pbmdcbiIpOwogCQlyZXR1cm4gZGV2LT5idXMtPnJlc3VtZShkZXYpOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwppbmRleCBkMWUwMjNmLi5mNTBhMDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYwpAQCAtMTksMjAgKzE5LDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc3Vic3lzdGVtIGRldmljZXNfc3Vic3lzOwogCiAKLWludCBkZXZpY2VfZGV0YWNoX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKiBkZXYpCi17Ci0JaWYgKCFkZXYtPmRldGFjaF9zdGF0ZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2LT5kZXRhY2hfc3RhdGUgPT0gREVWSUNFX1BNX09GRikgewotCQlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnNodXRkb3duKQotCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gZHBtX3J1bnRpbWVfc3VzcGVuZChkZXYsIGRldi0+ZGV0YWNoX3N0YXRlKTsKLX0KLQotCiAvKioKICAqIFdlIGhhbmRsZSBzeXN0ZW0gZGV2aWNlcyBkaWZmZXJlbnRseSAtIHdlIHN1c3BlbmQgYW5kIHNodXQgdGhlbQogICogZG93biBsYXN0IGFuZCByZXN1bWUgdGhlbSBmaXJzdC4gVGhhdCB3YXksIHdlIGRvbid0IGRvIGFueXRoaW5nIHN0dXBpZCBsaWtlCkBAIC01MiwxMyArMzgsMTIgQEAKIAlzdHJ1Y3QgZGV2aWNlICogZGV2OwogCiAJZG93bl93cml0ZSgmZGV2aWNlc19zdWJzeXMucndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShkZXYsICZkZXZpY2VzX3N1YnN5cy5rc2V0Lmxpc3QsIGtvYmouZW50cnkpIHsKLQkJcHJfZGVidWcoInNodXR0aW5nIGRvd24gJXM6ICIsIGRldi0+YnVzX2lkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZGV2LCAmZGV2aWNlc19zdWJzeXMua3NldC5saXN0LAorCQkJCWtvYmouZW50cnkpIHsKIAkJaWYgKGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5zaHV0ZG93bikgewotCQkJcHJfZGVidWcoIk9rXG4iKTsKKwkJCWRldl9kYmcoZGV2LCAic2h1dGRvd25cbiIpOwogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7Ci0JCX0gZWxzZQotCQkJcHJfZGVidWcoIklnbm9yZWQuXG4iKTsKKwkJfQogCX0KIAl1cF93cml0ZSgmZGV2aWNlc19zdWJzeXMucndzZW0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYwppbmRleCBhMGI1Y2Y2Li4wZWM0NGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMKQEAgLTM5LDEyICszOSwyNSBAQAogewogCWludCBlcnJvciA9IDA7CiAKLQlkZXZfZGJnKGRldiwgInN1c3BlbmRpbmdcbiIpOworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlKSB7CisJCWRldl9kYmcoZGV2LCAiUE06IHN1c3BlbmQgJWQtLT4lZFxuIiwKKwkJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUsIHN0YXRlKTsKKwl9CisJaWYgKGRldi0+cG93ZXIucG1fcGFyZW50CisJCQkmJiBkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUpIHsKKwkJZGV2X2VycihkZXYsCisJCQkiUE06IHN1c3BlbmQgJWQtPiVkLCBwYXJlbnQgJXMgYWxyZWFkeSAlZFxuIiwKKwkJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUsIHN0YXRlLAorCQkJZGV2LT5wb3dlci5wbV9wYXJlbnQtPmJ1c19pZCwKKwkJCWRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJfQogCiAJZGV2LT5wb3dlci5wcmV2X3N0YXRlID0gZGV2LT5wb3dlci5wb3dlcl9zdGF0ZTsKIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+c3VzcGVuZCAmJiAhZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSkKKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUpIHsKKwkJZGV2X2RiZyhkZXYsICJzdXNwZW5kaW5nXG4iKTsKIAkJZXJyb3IgPSBkZXYtPmJ1cy0+c3VzcGVuZChkZXYsIHN0YXRlKTsKKwl9CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2lvY3RsLmMgYi9kcml2ZXJzL2Jsb2NrL2lvY3RsLmMKaW5kZXggNWUwM2Y1MS4uNmQ3YmNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9pb2N0bC5jCisrKyBiL2RyaXZlcnMvYmxvY2svaW9jdGwuYwpAQCAtMjM3LDMgKzIzNyw1IEBACiAJfQogCXJldHVybiByZXQ7CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGJsa2Rldl9pb2N0bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IDFhMWZhM2MuLmJjNTY3NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC05MTQsOCArOTE0LDEwIEBACiAJCWJpbyA9IG5vZGUtPmJpbzsKIAkJem9uZSA9IFpPTkUoYmlvLT5iaV9zZWN0b3IsIHBkKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcGQtPmNkcncucGt0X2FjdGl2ZV9saXN0LCBsaXN0KSB7Ci0JCQlpZiAocC0+c2VjdG9yID09IHpvbmUpCisJCQlpZiAocC0+c2VjdG9yID09IHpvbmUpIHsKKwkJCQliaW8gPSBOVUxMOwogCQkJCWdvdG8gdHJ5X25leHRfYmlvOworCQkJfQogCQl9CiAJCWJyZWFrOwogdHJ5X25leHRfYmlvOgpAQCAtMjAxOSw3ICsyMDIxLDEzIEBACiAJQlVHX09OKHBkLT5yZWZjbnQgPCAwKTsKIAogCXBkLT5yZWZjbnQrKzsKLQlpZiAocGQtPnJlZmNudCA9PSAxKSB7CisJaWYgKHBkLT5yZWZjbnQgPiAxKSB7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCSAgICAhdGVzdF9iaXQoUEFDS0VUX1dSSVRBQkxFLCAmcGQtPmZsYWdzKSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXRfZGVjOworCQl9CisJfSBlbHNlIHsKIAkJaWYgKHBrdF9vcGVuX2RldihwZCwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CiAJCQlyZXQgPSAtRUlPOwogCQkJZ290byBvdXRfZGVjOwpAQCAtMjQwNiw3ICsyNDE0LDcgQEAKIAljYXNlIENEUk9NX0xBU1RfV1JJVFRFTjoKIAljYXNlIENEUk9NX1NFTkRfUEFDS0VUOgogCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6Ci0JCXJldHVybiBpb2N0bF9ieV9iZGV2KHBkLT5iZGV2LCBjbWQsIGFyZyk7CisJCXJldHVybiBibGtkZXZfaW9jdGwocGQtPmJkZXYtPmJkX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CiAKIAljYXNlIENEUk9NRUpFQ1Q6CiAJCS8qCkBAIC0yNDE0LDcgKzI0MjIsNyBAQAogCQkgKiBoYXZlIHRvIHVubG9jayBpdCBvciBlbHNlIHRoZSBlamVjdCBjb21tYW5kIGZhaWxzLgogCQkgKi8KIAkJcGt0X2xvY2tfZG9vcihwZCwgMCk7Ci0JCXJldHVybiBpb2N0bF9ieV9iZGV2KHBkLT5iZGV2LCBjbWQsIGFyZyk7CisJCXJldHVybiBibGtkZXZfaW9jdGwocGQtPmJkZXYtPmJkX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CiAKIAlkZWZhdWx0OgogCQlwcmludGsoInBrdGNkdmQ6IFVua25vd24gaW9jdGwgZm9yICVzICgleClcbiIsIHBkLT5uYW1lLCBjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYwppbmRleCA0OWQ2N2Y1Li42ZGM3NjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwbWkuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjZGVmaW5lIElQTUlfREVWSU5URl9WRVJTSU9OICJ2MzMiCiAKQEAgLTUxOSwxNSArNTIwLDIxIEBACiAJCSAiIGludGVyZmFjZS4gIE90aGVyIHZhbHVlcyB3aWxsIHNldCB0aGUgbWFqb3IgZGV2aWNlIG51bWJlciIKIAkJICIgdG8gdGhhdCB2YWx1ZS4iKTsKIAorc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmlwbWlfY2xhc3M7CisKIHN0YXRpYyB2b2lkIGlwbWlfbmV3X3NtaShpbnQgaWZfbnVtKQogewotCWRldmZzX21rX2NkZXYoTUtERVYoaXBtaV9tYWpvciwgaWZfbnVtKSwKLQkJICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCWRldl90IGRldiA9IE1LREVWKGlwbWlfbWFqb3IsIGlmX251bSk7CisKKwlkZXZmc19ta19jZGV2KGRldiwgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAogCQkgICAgICAiaXBtaWRldi8lZCIsIGlmX251bSk7CisKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChpcG1pX2NsYXNzLCBkZXYsIE5VTEwsICJpcG1pJWQiLCBpZl9udW0pOwogfQogCiBzdGF0aWMgdm9pZCBpcG1pX3NtaV9nb25lKGludCBpZl9udW0pCiB7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoaXBtaV9tYWpvciwgaWZfbnVtKSk7CiAJZGV2ZnNfcmVtb3ZlKCJpcG1pZGV2LyVkIiwgaWZfbnVtKTsKIH0KIApAQCAtNTQ4LDggKzU1NSwxNSBAQAogCXByaW50ayhLRVJOX0lORk8gImlwbWkgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uICIKIAkgICAgICAgSVBNSV9ERVZJTlRGX1ZFUlNJT04gIlxuIik7CiAKKwlpcG1pX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgImlwbWkiKTsKKwlpZiAoSVNfRVJSKGlwbWlfY2xhc3MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaTogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIGNsYXNzXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoaXBtaV9jbGFzcyk7CisJfQorCiAJcnYgPSByZWdpc3Rlcl9jaHJkZXYoaXBtaV9tYWpvciwgREVWSUNFX05BTUUsICZpcG1pX2ZvcHMpOwogCWlmIChydiA8IDApIHsKKwkJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koaXBtaV9jbGFzcyk7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBtaTogY2FuJ3QgZ2V0IG1ham9yICVkXG4iLCBpcG1pX21ham9yKTsKIAkJcmV0dXJuIHJ2OwogCX0KQEAgLTU2Myw2ICs1NzcsNyBAQAogCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOwogCWlmIChydikgewogCQl1bnJlZ2lzdGVyX2NocmRldihpcG1pX21ham9yLCBERVZJQ0VfTkFNRSk7CisJCWNsYXNzX3NpbXBsZV9kZXN0cm95KGlwbWlfY2xhc3MpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcG1pOiBjYW4ndCByZWdpc3RlciBzbWkgd2F0Y2hlclxuIik7CiAJCXJldHVybiBydjsKIAl9CkBAIC01NzMsNiArNTg4LDcgQEAKIAogc3RhdGljIF9fZXhpdCB2b2lkIGNsZWFudXBfaXBtaSh2b2lkKQogeworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGlwbWlfY2xhc3MpOwogCWlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3Rlcigmc21pX3dhdGNoZXIpOwogCWRldmZzX3JlbW92ZShERVZJQ0VfTkFNRSk7CiAJdW5yZWdpc3Rlcl9jaHJkZXYoaXBtaV9tYWpvciwgREVWSUNFX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCmluZGV4IGEyZTMzZWMuLmNhNWY0MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYXcuYworKysgYi9kcml2ZXJzL2NoYXIvcmF3LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKLQlyZXR1cm4gaW9jdGxfYnlfYmRldihiZGV2LCBjb21tYW5kLCBhcmcpOworCXJldHVybiBibGtkZXZfaW9jdGwoYmRldi0+YmRfaW5vZGUsIE5VTEwsIGNvbW1hbmQsIGFyZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJpbmRfZGV2aWNlKHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYwppbmRleCBjMzM3OTc4Li5iMTRkNjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYwpAQCAtMzgyLDYgKzM4Miw3IEBACiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl8xLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAogCXsgMCwgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgaTh4eF90Y29fcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jCmluZGV4IGRkMGQ0YzQuLjg2N2Q0NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jCkBAIC01MTYsNiArNTE2LDExIEBACiAJdTMyICpwc3RlcHMsICpwcmF0ZTsKIAlpbnQgcmM7CiAKKwlpZiAobnAtPm5faW50cnMgPCAxIHx8IG5wLT5uX2FkZHJzIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNaXNzaW5nIGludGVycnVwdCBvciBhZGRyZXNzICFcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCWlmIChwbWFjX2xvd19pMmNfbG9jayhucCkpCiAJCXJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDMzYTAyMGYuLjRmN2NlNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC0xOTMzLDcgKzE5MzMsNyBAQAogCQkvKgogCQkgKiBjaGVjayBpZiBkbWEgaXMgc2FmZQogCQkgKi8KLQkJaWYgKChycS0+ZGF0YV9sZW4gJiBtYXNrKSB8fCAoYWRkciAmIG1hc2spKQorCQlpZiAoKHJxLT5kYXRhX2xlbiAmIDMpIHx8IChhZGRyICYgbWFzaykpCiAJCQlpbmZvLT5kbWEgPSAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKaW5kZXggYmRmZjVhYy4uNGIxZTQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC01MTYsNiArNTE2LDYgQEAKIAogdm9pZCBwcm9jX2lkZV9kZXN0cm95KHZvaWQpCiB7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlkZS9kcml2ZXJzIiwgcHJvY19pZGVfcm9vdCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlcnMiLCBwcm9jX2lkZV9yb290KTsKIAlyZW1vdmVfcHJvY19lbnRyeSgiaWRlIiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKaW5kZXggNzhiMjAxZi4uN2Q1OGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZwpAQCAtODQsMTEgKzg0LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaWx5bnguCiAKLSMgTm9uLW1haW50YWluZWQgcGNpbHlueCBvcHRpb25zCi0jIGlmIFsgIiRDT05GSUdfSUVFRTEzOTRfUENJTFlOWCIgIT0gIm4iIF07IHRoZW4KLSMgICAgIGJvb2wgJyAgICBVc2UgUENJTHlueCBsb2NhbCBSQU0nIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNCi0jICAgICBib29sICcgICAgU3VwcG9ydCBmb3Igbm9uLUlFRUUxMzk0IGxvY2FsIHBvcnRzJyBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUwotIyBmaQogY29uZmlnIElFRUUxMzk0X09IQ0kxMzk0CiAJdHJpc3RhdGUgIk9IQ0ktMTM5NCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIElFRUUxMzk0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCmluZGV4IDFjNTg0NWYuLmEyOTRlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAogCWlmICghcGFja2V0LT5ub193YWl0ZXIgfHwgcGFja2V0LT5leHBlY3RfcmVzcG9uc2UpIHsKIAkJYXRvbWljX2luYygmcGFja2V0LT5yZWZjbnQpOwotCQlwYWNrZXQtPnNlbmR0aW1lID0gamlmZmllczsKKwkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXMgKyAxMCAqIEhaOwogCQlza2JfcXVldWVfdGFpbCgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUsIHBhY2tldC0+c2tiKTsKIAl9CiAKQEAgLTEyNDgsNyArMTI0OCw2IEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfbWFrZV9pc29wYWNrZXQpOwogRVhQT1JUX1NZTUJPTChocHNiX3JlYWQpOwogRVhQT1JUX1NZTUJPTChocHNiX3dyaXRlKTsKLUVYUE9SVF9TWU1CT0woaHBzYl9sb2NrKTsKIEVYUE9SVF9TWU1CT0woaHBzYl9wYWNrZXRfc3VjY2Vzcyk7CiAKIC8qKiBoaWdobGV2ZWwuYyAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5jCmluZGV4IDA5OTA4YjkuLjBhYTg3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuYwpAQCAtNTM1LDYgKzUzNSw3IEBACiAgICAgICAgIHJldHVybiByZXR2YWw7CiB9CiAKKyNpZiAwCiAKIGludCBocHNiX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24sCiAJICAgICAgdTY0IGFkZHIsIGludCBleHRjb2RlLCBxdWFkbGV0X3QgKmRhdGEsIHF1YWRsZXRfdCBhcmcpCkBAIC01OTksMyArNjAwLDUgQEAKIAogCXJldHVybiByZXR2YWw7CiB9CisKKyNlbmRpZiAgLyogIDAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuaAppbmRleCA1MjZhNDNjLi40NWJhNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmgKQEAgLTUzLDEyICs1Myw1IEBACiAJICAgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKIGludCBocHNiX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAogCSAgICAgICB1NjQgYWRkciwgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOwotaW50IGhwc2JfbG9jayhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBub2RlaWRfdCBub2RlLCB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbiwKLQkgICAgICB1NjQgYWRkciwgaW50IGV4dGNvZGUsIHF1YWRsZXRfdCAqZGF0YSwgcXVhZGxldF90IGFyZyk7Ci1pbnQgaHBzYl9sb2NrNjQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24sCi0JCXU2NCBhZGRyLCBpbnQgZXh0Y29kZSwgb2N0bGV0X3QgKmRhdGEsIG9jdGxldF90IGFyZyk7Ci1pbnQgaHBzYl9zZW5kX2dhc3Aoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgIHF1YWRsZXRfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCB1MzIgc3BlY2lmaWVyX2lkLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uKTsKIAogI2VuZGlmIC8qIF9JRUVFMTM5NF9UUkFOU0FDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCBhMWUzMGE2Li44M2U2NmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMTAwNSw4ICsxMDA1LDcgQEAKIAlyZXR1cm4gdWQ7CiAKIHVuaXRfZGlyZWN0b3J5X2Vycm9yOgotCWlmICh1ZCAhPSBOVUxMKQotCQlrZnJlZSh1ZCk7CisJa2ZyZWUodWQpOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKaW5kZXggNmNiMGI1OC4uMzZlMjVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwpAQCAtMjkzMSw3ICsyOTMxLDcgQEAKIAkJa2ZyZWUoZC0+cHJnX2NwdSk7CiAJCWtmcmVlKGQtPnByZ19idXMpOwogCX0KLQlpZiAoZC0+c3BiKSBrZnJlZShkLT5zcGIpOworCWtmcmVlKGQtPnNwYik7CiAKIAkvKiBNYXJrIHRoaXMgY29udGV4dCBhcyBmcmVlZC4gKi8KIAlkLT5vaGNpID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuaAppbmRleCBkMTc1OGQ0Li5jYzY2YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5oCkBAIC0yMzYsNiArMjM2LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY3Jvc3NfYm91bmQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwogCWlmIChzaXplID4gUEFHRV9TSVpFKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwppbmRleCBhMjYxZDJiLi5iZGIzYTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTgzNCwzMjcgKzgzNSw2IEBACiAgKiBJRUVFLTEzOTQgZnVuY3Rpb25hbGl0eSBzZWN0aW9uIEVORCAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKLS8qIFZGUyBmdW5jdGlvbnMgZm9yIGxvY2FsIGJ1cyAvIGF1eCBkZXZpY2UgYWNjZXNzLiAgQWNjZXNzIHRvIHRob3NlCi0gKiBpcyBpbXBsZW1lbnRlZCBhcyBhIGNoYXJhY3RlciBkZXZpY2UgaW5zdGVhZCBvZiBibG9jayBkZXZpY2VzCi0gKiBiZWNhdXNlIGJ1ZmZlcnMgYXJlIG5vdCB3YW50ZWQgZm9yIHRoaXMuICBUaGVyZWZvcmUgbGxzZWVrIChmcm9tCi0gKiBWRlMpIGNhbiBiZSB1c2VkIGZvciB0aGVzZSBjaGFyIGRldmljZXMgd2l0aCBvYnZpb3VzIGVmZmVjdHMuCi0gKi8KLXN0YXRpYyBpbnQgbWVtX29wZW4oc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqKTsKLXN0YXRpYyBpbnQgbWVtX3JlbGVhc2Uoc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXV4X3BvbGwoc3RydWN0IGZpbGUqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QqKTsKLXN0YXRpYyBsb2ZmX3QgbWVtX2xsc2VlayhzdHJ1Y3QgZmlsZSosIGxvZmZfdCwgaW50KTsKLXN0YXRpYyBzc2l6ZV90IG1lbV9yZWFkIChzdHJ1Y3QgZmlsZSosIGNoYXIqLCBzaXplX3QsIGxvZmZfdCopOwotc3RhdGljIHNzaXplX3QgbWVtX3dyaXRlKHN0cnVjdCBmaWxlKiwgY29uc3QgY2hhciosIHNpemVfdCwgbG9mZl90Kik7Ci0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV4X29wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLSAgICAgICAgLnJlYWQgPSAgICAgICAgIG1lbV9yZWFkLAotICAgICAgICAud3JpdGUgPSAgICAgICAgbWVtX3dyaXRlLAotICAgICAgICAucG9sbCA9ICAgICAgICAgYXV4X3BvbGwsCi0gICAgICAgIC5sbHNlZWsgPSAgICAgICBtZW1fbGxzZWVrLAotICAgICAgICAub3BlbiA9ICAgICAgICAgbWVtX29wZW4sCi0gICAgICAgIC5yZWxlYXNlID0gICAgICBtZW1fcmVsZWFzZSwKLX07Ci0KLQotc3RhdGljIHZvaWQgYXV4X3NldHVwX3BjbHMoc3RydWN0IHRpX2x5bnggKmx5bngpCi17Ci0gICAgICAgIHN0cnVjdCB0aV9wY2wgcGNsOwotCi0gICAgICAgIHBjbC5uZXh0ID0gUENMX05FWFRfSU5WQUxJRDsKLSAgICAgICAgcGNsLnVzZXJfZGF0YSA9IHBjbF9idXMobHlueCwgbHlueC0+ZG1lbV9wY2wpOwotICAgICAgICBwdXRfcGNsKGx5bngsIGx5bngtPmRtZW1fcGNsLCAmcGNsKTsKLX0KLQotc3RhdGljIGludCBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICAgICAgaW50IGNpZCA9IGltaW5vcihpbm9kZSk7Ci0gICAgICAgIGVudW0geyB0X3JvbSwgdF9hdXgsIHRfcmFtIH0gdHlwZTsKLSAgICAgICAgc3RydWN0IG1lbWRhdGEgKm1kOwotCi0gICAgICAgIGlmIChjaWQgPCBQQ0lMWU5YX01JTk9SX0FVWF9TVEFSVCkgewotICAgICAgICAgICAgICAgIC8qIGp1c3QgZm9yIGNvbXBsZXRlbmVzcyAqLwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87Ci0gICAgICAgIH0gZWxzZSBpZiAoY2lkIDwgUENJTFlOWF9NSU5PUl9ST01fU1RBUlQpIHsKLSAgICAgICAgICAgICAgICBjaWQgLT0gUENJTFlOWF9NSU5PUl9BVVhfU1RBUlQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNpZCA+PSBudW1fb2ZfY2FyZHMgfHwgIWNhcmRzW2NpZF0uYXV4X3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIHR5cGUgPSB0X2F1eDsKLSAgICAgICAgfSBlbHNlIGlmIChjaWQgPCBQQ0lMWU5YX01JTk9SX1JBTV9TVEFSVCkgewotICAgICAgICAgICAgICAgIGNpZCAtPSBQQ0lMWU5YX01JTk9SX1JPTV9TVEFSVDsKLSAgICAgICAgICAgICAgICBpZiAoY2lkID49IG51bV9vZl9jYXJkcyB8fCAhY2FyZHNbY2lkXS5sb2NhbF9yb20pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIHR5cGUgPSB0X3JvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBXQVJOSU5HOiBLbm93IHdoYXQgeW91IGFyZSBkb2luZyB3aGVuIG9wZW5pbmcgUkFNLgotICAgICAgICAgICAgICAgICAqIEl0IGlzIGN1cnJlbnRseSB1c2VkIGluc2lkZSB0aGUgZHJpdmVyISAqLwotICAgICAgICAgICAgICAgIGNpZCAtPSBQQ0lMWU5YX01JTk9SX1JBTV9TVEFSVDsKLSAgICAgICAgICAgICAgICBpZiAoY2lkID49IG51bV9vZl9jYXJkcyB8fCAhY2FyZHNbY2lkXS5sb2NhbF9yYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIHR5cGUgPSB0X3JhbTsKLSAgICAgICAgfQotCi0gICAgICAgIG1kID0gKHN0cnVjdCBtZW1kYXRhICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG1lbWRhdGEpLCBTTEFCX0tFUk5FTCk7Ci0gICAgICAgIGlmIChtZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotCi0gICAgICAgIG1kLT5seW54ID0gJmNhcmRzW2NpZF07Ci0gICAgICAgIG1kLT5jaWQgPSBjaWQ7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgdF9yb206Ci0gICAgICAgICAgICAgICAgbWQtPnR5cGUgPSByb207Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9yYW06Ci0gICAgICAgICAgICAgICAgbWQtPnR5cGUgPSByYW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9hdXg6Ci0gICAgICAgICAgICAgICAgYXRvbWljX3NldCgmbWQtPmF1eF9pbnRyX2xhc3Rfc2VlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19yZWFkKCZjYXJkc1tjaWRdLmF1eF9pbnRyX3NlZW4pKTsKLSAgICAgICAgICAgICAgICBtZC0+dHlwZSA9IGF1eDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IG1kOwotCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1lbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgICAgICBrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhdXhfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcHQpCi17Ci0gICAgICAgIHN0cnVjdCBtZW1kYXRhICptZCA9IChzdHJ1Y3QgbWVtZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgaW50IGNpZCA9IG1kLT5jaWQ7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrOwotCi0gICAgICAgIC8qIHJlYWRpbmcgYW5kIHdyaXRpbmcgaXMgYWx3YXlzIGFsbG93ZWQgKi8KLSAgICAgICAgbWFzayA9IFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotICAgICAgICBpZiAobWQtPnR5cGUgPT0gYXV4KSB7Ci0gICAgICAgICAgICAgICAgcG9sbF93YWl0KGZpbGUsICZjYXJkc1tjaWRdLmF1eF9pbnRyX3dhaXQsIHB0KTsKLQotICAgICAgICAgICAgICAgIGlmIChhdG9taWNfcmVhZCgmbWQtPmF1eF9pbnRyX2xhc3Rfc2VlbikKLSAgICAgICAgICAgICAgICAgICAgIT0gYXRvbWljX3JlYWQoJmNhcmRzW2NpZF0uYXV4X2ludHJfc2VlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTFBSSTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJm1kLT5hdXhfaW50cl9sYXN0X3NlZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXNrOwotfQotCi1sb2ZmX3QgbWVtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnMsIGludCBvcmlnKQotewotICAgICAgICBsb2ZmX3QgbmV3b2ZmczsKLQotICAgICAgICBzd2l0Y2ggKG9yaWcpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIG5ld29mZnMgPSBvZmZzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbmV3b2ZmcyA9IG9mZnMgKyBmaWxlLT5mX3BvczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIG5ld29mZnMgPSBQQ0lMWU5YX01BWF9NRU1PUlkgKyAxICsgb2ZmczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdvZmZzIDwgMCB8fCBuZXdvZmZzID4gUENJTFlOWF9NQVhfTUVNT1JZICsgMSkgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgZmlsZS0+Zl9wb3MgPSBuZXdvZmZzOwotICAgICAgICByZXR1cm4gbmV3b2ZmczsKLX0KLQotLyoKLSAqIGRvIG5vdCBETUEgaWYgY291bnQgaXMgdG9vIHNtYWxsIGJlY2F1c2UgdGhpcyB3aWxsIGhhdmUgYSBzZXJpb3VzIGltcGFjdAotICogb24gcGVyZm9ybWFuY2UgLSB0aGUgdmFsdWUgMjQwMCB3YXMgZm91bmQgYnkgZXhwZXJpbWVudCBhbmQgbWF5IG5vdCB3b3JrCi0gKiBldmVyeXdoZXJlIGFzIGdvb2QgYXMgaGVyZSAtIHVzZSBtZW1fbWluZG1hIG9wdGlvbiBmb3IgbW9kdWxlcyB0byBjaGFuZ2UKLSAqLwotc3RhdGljIHNob3J0IG1lbV9taW5kbWEgPSAyNDAwOwotbW9kdWxlX3BhcmFtKG1lbV9taW5kbWEsIHNob3J0LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobWVtX21pbmRtYSwgIk1pbmltdW0gYW1vdW50IG9mIGRhdGEgcmVxdWlyZWQgdG8gdXNlIERNQSIpOwotCi1zdGF0aWMgc3NpemVfdCBtZW1fZG1hcmVhZChzdHJ1Y3QgbWVtZGF0YSAqbWQsIHUzMiBwaHlzYnVmLCBzc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkKLXsKLSAgICAgICAgcGNsdG1wX3QgcGNsdG1wOwotICAgICAgICBzdHJ1Y3QgdGlfcGNsICpwY2w7Ci0gICAgICAgIHNpemVfdCByZXR2YWw7Ci0gICAgICAgIGludCBpOwotICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotICAgICAgICBjb3VudCAmPSB+MzsKLSAgICAgICAgY291bnQgPSBtaW4oY291bnQsIDUzMTk2KTsKLSAgICAgICAgcmV0dmFsID0gY291bnQ7Ci0KLSAgICAgICAgaWYgKHJlZ19yZWFkKG1kLT5seW54LCBETUFfQ0hBTl9DVFJMKENIQU5ORUxfTE9DQUxCVVMpKQotICAgICAgICAgICAgJiBETUFfQ0hBTl9DVFJMX0JVU1kpIHsKLSAgICAgICAgICAgICAgICBQUklOVChLRVJOX1dBUk5JTkcsIG1kLT5seW54LT5pZCwgIkRNQSBBTFJFQURZIEFDVElWRSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlZ193cml0ZShtZC0+bHlueCwgTEJVU19BRERSLCBtZC0+dHlwZSB8IG9mZnNldCk7Ci0KLSAgICAgICAgcGNsID0gZWRpdF9wY2wobWQtPmx5bngsIG1kLT5seW54LT5kbWVtX3BjbCwgJnBjbHRtcCk7Ci0gICAgICAgIHBjbC0+YnVmZmVyWzBdLmNvbnRyb2wgPSBQQ0xfQ01EX0xCVVNfVE9fUENJIHwgbWluKGNvdW50LCA0MDkyKTsKLSAgICAgICAgcGNsLT5idWZmZXJbMF0ucG9pbnRlciA9IHBoeXNidWY7Ci0gICAgICAgIGNvdW50IC09IDQwOTI7Ci0KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgcGNsLT5idWZmZXJbaV0uY29udHJvbCA9IG1pbihjb3VudCwgNDA5Mik7Ci0gICAgICAgICAgICAgICAgcGNsLT5idWZmZXJbaV0ucG9pbnRlciA9IHBoeXNidWYgKyBpICogNDA5MjsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSA0MDkyOwotICAgICAgICB9Ci0gICAgICAgIHBjbC0+YnVmZmVyW2ldLmNvbnRyb2wgfD0gUENMX0xBU1RfQlVGRjsKLSAgICAgICAgY29tbWl0X3BjbChtZC0+bHlueCwgbWQtPmx5bngtPmRtZW1fcGNsLCAmcGNsdG1wKTsKLQotICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmbWQtPmx5bngtPm1lbV9kbWFfaW50cl93YWl0LCAmd2FpdCk7Ci0gICAgICAgIHJ1bl9zdWJfcGNsKG1kLT5seW54LCBtZC0+bHlueC0+ZG1lbV9wY2wsIDIsIENIQU5ORUxfTE9DQUxCVVMpOwotCi0gICAgICAgIHNjaGVkdWxlKCk7Ci0gICAgICAgIHdoaWxlIChyZWdfcmVhZChtZC0+bHlueCwgRE1BX0NIQU5fQ1RSTChDSEFOTkVMX0xPQ0FMQlVTKSkKLSAgICAgICAgICAgICAgICYgRE1BX0NIQU5fQ1RSTF9CVVNZKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAtRUlOVFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlZ193cml0ZShtZC0+bHlueCwgRE1BX0NIQU5fQ1RSTChDSEFOTkVMX0xPQ0FMQlVTKSwgMCk7Ci0gICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZtZC0+bHlueC0+bWVtX2RtYV9pbnRyX3dhaXQsICZ3YWl0KTsKLQotICAgICAgICBpZiAocmVnX3JlYWQobWQtPmx5bngsIERNQV9DSEFOX0NUUkwoQ0hBTk5FTF9MT0NBTEJVUykpCi0gICAgICAgICAgICAmIERNQV9DSEFOX0NUUkxfQlVTWSkgewotICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBtZC0+bHlueC0+aWQsICJETUEgU1RJTEwgQUNUSVZFISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHNzaXplX3QgbWVtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpvZmZzZXQpCi17Ci0gICAgICAgIHN0cnVjdCBtZW1kYXRhICptZCA9IChzdHJ1Y3QgbWVtZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgc3NpemVfdCBiY291bnQ7Ci0gICAgICAgIHNpemVfdCBhbGlnbmZpeDsKLQlsb2ZmX3Qgb2ZmID0gKm9mZnNldDsgLyogYXZvaWQgdXNlbGVzcyA2NGJpdC1hcml0aG1ldGljICovCi0gICAgICAgIHNzaXplX3QgcmV0dmFsOwotICAgICAgICB2b2lkICptZW1iYXNlOwotCi0gICAgICAgIGlmICgob2ZmICsgY291bnQpID4gUENJTFlOWF9NQVhfTUVNT1JZKzEpIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IFBDSUxZTlhfTUFYX01FTU9SWSsxIC0gb2ZmOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA9PSAwIHx8IG9mZiA+IFBDSUxZTlhfTUFYX01FTU9SWSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PU1BDOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtZC0+dHlwZSkgewotICAgICAgICBjYXNlIHJvbToKLSAgICAgICAgICAgICAgICBtZW1iYXNlID0gbWQtPmx5bngtPmxvY2FsX3JvbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSByYW06Ci0gICAgICAgICAgICAgICAgbWVtYmFzZSA9IG1kLT5seW54LT5sb2NhbF9yYW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgYXV4OgotICAgICAgICAgICAgICAgIG1lbWJhc2UgPSBtZC0+bHlueC0+YXV4X3BvcnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcGFuaWMoInBjaWx5bnglZDogdW5zdXBwb3J0ZWQgbWQtPnR5cGUgJWQgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgIG1kLT5seW54LT5pZCwgbWQtPnR5cGUsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIH0KLQotICAgICAgICBkb3duKCZtZC0+bHlueC0+bWVtX2RtYV9tdXRleCk7Ci0KLSAgICAgICAgaWYgKGNvdW50IDwgbWVtX21pbmRtYSkgewotICAgICAgICAgICAgICAgIG1lbWNweV9mcm9taW8obWQtPmx5bngtPm1lbV9kbWFfYnVmZmVyLCBtZW1iYXNlK29mZiwgY291bnQpOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgYmNvdW50ID0gY291bnQ7Ci0gICAgICAgIGFsaWduZml4ID0gNCAtIChvZmYgJSA0KTsKLSAgICAgICAgaWYgKGFsaWduZml4ICE9IDQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmNvdW50IDwgYWxpZ25maXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZml4ID0gYmNvdW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKG1kLT5seW54LT5tZW1fZG1hX2J1ZmZlciwgbWVtYmFzZStvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmZpeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJjb3VudCA9PSBhbGlnbmZpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJjb3VudCAtPSBhbGlnbmZpeDsKLSAgICAgICAgICAgICAgICBvZmYgKz0gYWxpZ25maXg7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoYmNvdW50ID49IDQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSBtZW1fZG1hcmVhZChtZCwgbWQtPmx5bngtPm1lbV9kbWFfYnVmZmVyX2RtYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY291bnQgLSBiY291bnQsIGJjb3VudCwgb2ZmKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsKLQotICAgICAgICAgICAgICAgIGJjb3VudCAtPSByZXR2YWw7Ci0gICAgICAgICAgICAgICAgb2ZmICs9IHJldHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiY291bnQpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKG1kLT5seW54LT5tZW1fZG1hX2J1ZmZlciArIGNvdW50IC0gYmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmFzZStvZmYsIGJjb3VudCk7Ci0gICAgICAgIH0KLQotIG91dDoKLSAgICAgICAgcmV0dmFsID0gY29weV90b191c2VyKGJ1ZmZlciwgbWQtPmx5bngtPm1lbV9kbWFfYnVmZmVyLCBjb3VudCk7Ci0gICAgICAgIHVwKCZtZC0+bHlueC0+bWVtX2RtYV9tdXRleCk7Ci0KLQlpZiAocmV0dmFsKSByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgKm9mZnNldCArPSBjb3VudDsKLSAgICAgICAgcmV0dXJuIGNvdW50OwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IG1lbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpvZmZzZXQpCi17Ci0gICAgICAgIHN0cnVjdCBtZW1kYXRhICptZCA9IChzdHJ1Y3QgbWVtZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQotICAgICAgICBpZiAoKCgqb2Zmc2V0KSArIGNvdW50KSA+IFBDSUxZTlhfTUFYX01FTU9SWSsxKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBQQ0lMWU5YX01BWF9NRU1PUlkrMSAtICpvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50ID09IDAgfHwgKm9mZnNldCA+IFBDSUxZTlhfTUFYX01FTU9SWSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PU1BDOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRklYTUU6IGRlcmVmZXJlbmNpbmcgcG9pbnRlcnMgdG8gUENJIG1lbSBkb2Vzbid0IHdvcmsgZXZlcnl3aGVyZSAqLwotICAgICAgICBzd2l0Y2ggKG1kLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgYXV4OgotCQlpZiAoY29weV9mcm9tX3VzZXIobWQtPmx5bngtPmF1eF9wb3J0Kygqb2Zmc2V0KSwgYnVmZmVyLCBjb3VudCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSByYW06Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihtZC0+bHlueC0+bG9jYWxfcmFtKygqb2Zmc2V0KSwgYnVmZmVyLCBjb3VudCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSByb206Ci0gICAgICAgICAgICAgICAgLyogdGhlIFJPTSBtYXkgYmUgd3JpdGVhYmxlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihtZC0+bHlueC0+bG9jYWxfcm9tKygqb2Zmc2V0KSwgYnVmZmVyLCBjb3VudCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGUtPmZfcG9zICs9IGNvdW50OwotICAgICAgICByZXR1cm4gY291bnQ7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMgKi8KLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEdsb2JhbCBzdHVmZiAoaW50ZXJydXB0IGhhbmRsZXIsIGluaXQvc2h1dGRvd24gY29kZSkgKgpAQCAtMTE4MSwxOCArODYxLDYgQEAKICAgICAgICAgcmVnX3dyaXRlKGx5bngsIExJTktfSU5UX1NUQVRVUywgbGlua2ludCk7CiAgICAgICAgIHJlZ193cml0ZShseW54LCBQQ0lfSU5UX1NUQVRVUywgaW50bWFzayk7CiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUwotICAgICAgICBpZiAoaW50bWFzayAmIFBDSV9JTlRfQVVYX0lOVCkgewotICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJmx5bngtPmF1eF9pbnRyX3NlZW4pOwotICAgICAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmbHlueC0+YXV4X2ludHJfd2FpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW50bWFzayAmIFBDSV9JTlRfRE1BX0hMVChDSEFOTkVMX0xPQ0FMQlVTKSkgewotICAgICAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmbHlueC0+bWVtX2RtYV9pbnRyX3dhaXQpOwotICAgICAgICB9Ci0jZW5kaWYKLQotCiAgICAgICAgIGlmIChpbnRtYXNrICYgUENJX0lOVF8xMzk0KSB7CiAgICAgICAgICAgICAgICAgaWYgKGxpbmtpbnQgJiBMSU5LX0lOVF9QSFlfVElNRU9VVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgIlBIWSB0aW1lb3V0IG9jY3VycmVkIik7CkBAIC0xNDg0LDE1ICsxMTUyLDkgQEAKICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGx5bngtPmRldiwgUEFHRV9TSVpFLCBseW54LT5yY3ZfcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPnJjdl9wYWdlX2RtYSk7CiAgICAgICAgIGNhc2UgaGF2ZV9hdXhfYnVmOgotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTCi0gICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChseW54LT5kZXYsIDY1NTM2LCBseW54LT5tZW1fZG1hX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPm1lbV9kbWFfYnVmZmVyX2RtYSk7Ci0jZW5kaWYKICAgICAgICAgY2FzZSBoYXZlX3BjbF9tZW06Ci0jaWZuZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNCiAgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChseW54LT5kZXYsIExPQ0FMUkFNX1NJWkUsIGx5bngtPnBjbF9tZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBseW54LT5wY2xfbWVtX2RtYSk7Ci0jZW5kaWYKICAgICAgICAgY2FzZSBjbGVhcjoKICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nIC0gYWxyZWFkeSBmcmVlZCAqLwogICAgICAgICAgICAgICAgIDsKQEAgLTE1MjQsNyArMTE4Niw3IEBACiAKICAgICAgICAgZXJyb3IgPSAtRU5YSU87CiAKLSAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCAweGZmZmZmZmZmKSkKKyAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpCiAgICAgICAgICAgICAgICAgRkFJTCgiRE1BIGFkZHJlc3MgbGltaXRzIG5vdCBzdXBwb3J0ZWQgZm9yIFBDSUx5bnggaGFyZHdhcmUiKTsKICAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCiAgICAgICAgICAgICAgICAgRkFJTCgiZmFpbGVkIHRvIGVuYWJsZSBQQ0lMeW54IGhhcmR3YXJlIik7CkBAIC0xNTQ2LDcgKzEyMDgsNiBAQAogICAgICAgICBzcGluX2xvY2tfaW5pdCgmbHlueC0+bG9jayk7CiAgICAgICAgIHNwaW5fbG9ja19pbml0KCZseW54LT5waHlfcmVnX2xvY2spOwogCi0jaWZuZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNCiAgICAgICAgIGx5bngtPnBjbF9tZW0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIExPQ0FMUkFNX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHlueC0+cGNsX21lbV9kbWEpOwogCkBAIC0xNTU4LDE2ICsxMjE5LDYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gYWxsb2NhdGUgUENMIG1lbW9yeSBhcmVhIik7CiAgICAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKLSAgICAgICAgbHlueC0+bWVtX2RtYV9idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIDY1NTM2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZseW54LT5tZW1fZG1hX2J1ZmZlcl9kbWEpOwotICAgICAgICBpZiAobHlueC0+bWVtX2RtYV9idWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEZBSUwoImZhaWxlZCB0byBhbGxvY2F0ZSBETUEgYnVmZmVyIGZvciBhdXgiKTsKLSAgICAgICAgfQotICAgICAgICBseW54LT5zdGF0ZSA9IGhhdmVfYXV4X2J1ZjsKLSNlbmRpZgogCiAgICAgICAgIGx5bngtPnJjdl9wYWdlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCBQQUdFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx5bngtPnJjdl9wYWdlX2RtYSk7CkBAIC0xNTk3LDEzICsxMjQ4LDYgQEAKICAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gcmVtYXAgcmVnaXN0ZXJzIC0gY2FyZCBub3QgYWNjZXNzaWJsZSIpOwogICAgICAgICB9CiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTQotICAgICAgICBpZiAobHlueC0+bG9jYWxfcmFtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gcmVtYXAgbG9jYWwgUkFNIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIik7Ci0gICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgIHJlZ19zZXRfYml0cyhseW54LCBNSVNDX0NPTlRST0wsIE1JU0NfQ09OVFJPTF9TV1JFU0VUKTsKICAgICAgICAgLyogRml4IGJ1Z2d5IGNhcmRzIHdpdGggYXV0b2Jvb3QgcGluIG5vdCB0aWVkIGxvdzogKi8KICAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQTBfQ0hBTl9DVFJMLCAwKTsKQEAgLTE2MjQsMTMgKzEyNjgsNiBAQAogCiAgICAgICAgIC8qIGFsbG9jX3BjbCByZXR1cm4gdmFsdWVzIGFyZSBub3QgY2hlY2tlZCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUKICAgICAgICAgICogcHJvdmlkZWQgUENMIHNwYWNlIGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBpbml0aWFsIGFsbG9jYXRpb25zICovCi0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKLSAgICAgICAgaWYgKGx5bngtPmF1eF9wb3J0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBseW54LT5kbWVtX3BjbCA9IGFsbG9jX3BjbChseW54KTsKLSAgICAgICAgICAgICAgICBhdXhfc2V0dXBfcGNscyhseW54KTsKLSAgICAgICAgICAgICAgICBzZW1hX2luaXQoJmx5bngtPm1lbV9kbWFfbXV0ZXgsIDEpOwotICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgbHlueC0+cmN2X3BjbCA9IGFsbG9jX3BjbChseW54KTsKICAgICAgICAgbHlueC0+cmN2X3BjbF9zdGFydCA9IGFsbG9jX3BjbChseW54KTsKICAgICAgICAgbHlueC0+YXN5bmMucGNsID0gYWxsb2NfcGNsKGx5bngpOwpAQCAtMTY0NywxMiArMTI4NCw2IEBACiAKICAgICAgICAgcmVnX3dyaXRlKGx5bngsIFBDSV9JTlRfRU5BQkxFLCBQQ0lfSU5UX0RNQV9BTEwpOwogCi0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKLSAgICAgICAgcmVnX3NldF9iaXRzKGx5bngsIFBDSV9JTlRfRU5BQkxFLCBQQ0lfSU5UX0FVWF9JTlQpOwotICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZseW54LT5tZW1fZG1hX2ludHJfd2FpdCk7Ci0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmx5bngtPmF1eF9pbnRyX3dhaXQpOwotI2VuZGlmCi0KIAl0YXNrbGV0X2luaXQoJmx5bngtPmlzb19yY3YudHEsICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlpc29fcmN2X2JoLAogCQkgICAgICh1bnNpZ25lZCBsb25nKWx5bngpOwogCkBAIC0xOTQ0LDM3ICsxNTc1LDE4IEBACiB7CiAgICAgICAgIGludCByZXQ7CiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUwotICAgICAgICBpZiAocmVnaXN0ZXJfY2hyZGV2KFBDSUxZTlhfTUFKT1IsIFBDSUxZTlhfRFJJVkVSX05BTUUsICZhdXhfb3BzKSkgewotICAgICAgICAgICAgICAgIFBSSU5UX0coS0VSTl9FUlIsICJhbGxvY2F0aW9uIG9mIGNoYXIgbWFqb3IgbnVtYmVyICVkIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQQ0lMWU5YX01BSk9SKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICByZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZseW54X3BjaV9kcml2ZXIpOwogICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIFBSSU5UX0coS0VSTl9FUlIsICJQQ0kgbW9kdWxlIGluaXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgZ290byBmcmVlX2NoYXJfZGV2OworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMDsKLQotIGZyZWVfY2hhcl9kZXY6Ci0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKLSAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXYoUENJTFlOWF9NQUpPUiwgUENJTFlOWF9EUklWRVJfTkFNRSk7Ci0jZW5kaWYKLQotICAgICAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGNpbHlueF9jbGVhbnVwKHZvaWQpCiB7CiAgICAgICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbHlueF9wY2lfZHJpdmVyKTsKLQotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTCi0gICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2KFBDSUxZTlhfTUFKT1IsIFBDSUxZTlhfRFJJVkVSX05BTUUpOwotI2VuZGlmCiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmggYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaAppbmRleCA2NDRlYzU1Li5kNjMxYWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaApAQCAtNTUsMTYgKzU1LDYgQEAKICAgICAgICAgdm9pZCBfX2lvbWVtICphdXhfcG9ydDsKIAlxdWFkbGV0X3QgYnVzX2luZm9fYmxvY2tbNV07CiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUwotICAgICAgICBhdG9taWNfdCBhdXhfaW50cl9zZWVuOwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBhdXhfaW50cl93YWl0OwotCi0gICAgICAgIHZvaWQgKm1lbV9kbWFfYnVmZmVyOwotICAgICAgICBkbWFfYWRkcl90IG1lbV9kbWFfYnVmZmVyX2RtYTsKLSAgICAgICAgc3RydWN0IHNlbWFwaG9yZSBtZW1fZG1hX211dGV4OwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBtZW1fZG1hX2ludHJfd2FpdDsKLSNlbmRpZgotCiAgICAgICAgIC8qCiAgICAgICAgICAqIHVzZSBsb2NhbCBSQU0gb2YgTE9DQUxSQU1fU0laRSBieXRlcyBmb3IgUENMcywgd2hpY2ggYWxsb3dzIGZvcgogICAgICAgICAgKiBMT0NBTFJBTV9TSVpFICogOCBQQ0xzIChlYWNoIHNpemVkIDEyOCBieXRlcyk7CkBAIC03MiwxMSArNjIsOSBAQAogICAgICAgICAgKi8KICAgICAgICAgdTggcGNsX2JtYXBbTE9DQUxSQU1fU0laRSAvIDEwMjRdOwogCi0jaWZuZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNCiAJLyogcG9pbnQgdG8gUENMcyBtZW1vcnkgYXJlYSBpZiBuZWVkZWQgKi8KIAl2b2lkICpwY2xfbWVtOwogICAgICAgICBkbWFfYWRkcl90IHBjbF9tZW1fZG1hOwotI2VuZGlmCiAKICAgICAgICAgLyogUENMcyBmb3IgbG9jYWwgbWVtIC8gYXV4IHRyYW5zZmVycyAqLwogICAgICAgICBwY2xfdCBkbWVtX3BjbDsKQEAgLTM3OCwzOSArMzY2LDYgQEAKICNkZWZpbmUgcGNsb2ZmcyhNRU1CRVIpIChvZmZzZXRvZihzdHJ1Y3QgdGlfcGNsLCBNRU1CRVIpKQogCiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGlfcGNsICpwY2wpCi17Ci0gICAgICAgIGludCBpOwotICAgICAgICB1MzIgKmluID0gKHUzMiAqKXBjbDsKLSAgICAgICAgdTMyICpvdXQgPSAodTMyICopKGx5bngtPmxvY2FsX3JhbSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgb3V0KyssIGluKyspIHsKLSAgICAgICAgICAgICAgICB3cml0ZWwoKmluLCBvdXQpOwotICAgICAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGNsKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBwY2xfdCBwY2xpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aV9wY2wgKnBjbCkKLXsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIHUzMiAqb3V0ID0gKHUzMiAqKXBjbDsKLSAgICAgICAgdTMyICppbiA9ICh1MzIgKikobHlueC0+bG9jYWxfcmFtICsgcGNsaWQgKiBzaXplb2Yoc3RydWN0IHRpX3BjbCkpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrLCBvdXQrKywgaW4rKykgewotICAgICAgICAgICAgICAgICpvdXQgPSByZWFkbChpbik7Ci0gICAgICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB1MzIgcGNsX2J1cyhjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQpCi17Ci0gICAgICAgIHJldHVybiBwY2lfcmVzb3VyY2Vfc3RhcnQobHlueC0+ZGV2LCAxKSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpOwotfQotCi0jZWxzZSAvKiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTSAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGlfcGNsICpwY2wpCiB7CkBAIC00MzEsMTAgKzM4Niw4IEBACiAgICAgICAgIHJldHVybiBseW54LT5wY2xfbWVtX2RtYSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0gKi8KIAotCi0jaWYgZGVmaW5lZCAoQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0pIHx8IGRlZmluZWQgKF9fQklHX0VORElBTikKKyNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU4pCiB0eXBlZGVmIHN0cnVjdCB0aV9wY2wgcGNsdG1wX3Q7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRpX3BjbCAqZWRpdF9wY2woY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKaW5kZXggNGJlZGY3MS4uZDY4YzQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCkBAIC0zNSw2ICszNSwxMSBAQAogICoKICAqLwogCisvKiBNYXJrdXMgVGF2ZW5yYXRoIDxzcGVlZHlnb29Ac3BlZWR5Z29vLmRlPiA6CisgICAtIGZpeGVkIGNoZWNrcyBmb3IgdmFsaWQgYnVmZmVyLW51bWJlcnMgaW4gdmlkZW8xMzk0X2ljb3RsCisgICAtIGNoYW5nZWQgdGhlIHdheXMgdGhlIGRtYSBwcmcncyBhcmUgdXNlZCwgbm93IGl0J3MgcG9zc2libGUgdG8gdXNlCisgICAgIGV2ZW4gYSBzaW5nbGUgZG1hIGJ1ZmZlcgorKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0xMTIsNiArMTE3LDcgQEAKIAlzdHJ1Y3QgaXRfZG1hX3ByZyAqKml0X3ByZzsKIAogCXVuc2lnbmVkIGludCAqYnVmZmVyX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgKmJ1ZmZlcl9wcmdfYXNzaWdubWVudDsKICAgICAgICAgc3RydWN0IHRpbWV2YWwgKmJ1ZmZlcl90aW1lOyAvKiB0aW1lIHdoZW4gdGhlIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgKi8KIAl1bnNpZ25lZCBpbnQgKmxhc3RfdXNlZF9jbWQ7IC8qIEZvciBJU08gVHJhbnNtaXQgd2l0aAogCQkJCQl2YXJpYWJsZSBzaXplZCBwYWNrZXRzIG9ubHkgISAqLwpAQCAtMTgwLDIzICsxODYsMTQgQEAKIAkJa2ZyZWUoZC0+cHJnX3JlZyk7CiAJfQogCi0JaWYgKGQtPmlyX3ByZykKLQkJa2ZyZWUoZC0+aXJfcHJnKTsKLQotCWlmIChkLT5pdF9wcmcpCi0JCWtmcmVlKGQtPml0X3ByZyk7Ci0KLQlpZiAoZC0+YnVmZmVyX3N0YXR1cykKLQkJa2ZyZWUoZC0+YnVmZmVyX3N0YXR1cyk7Ci0JaWYgKGQtPmJ1ZmZlcl90aW1lKQotCQlrZnJlZShkLT5idWZmZXJfdGltZSk7Ci0JaWYgKGQtPmxhc3RfdXNlZF9jbWQpCi0JCWtmcmVlKGQtPmxhc3RfdXNlZF9jbWQpOwotCWlmIChkLT5uZXh0X2J1ZmZlcikKLQkJa2ZyZWUoZC0+bmV4dF9idWZmZXIpOwotCisJa2ZyZWUoZC0+aXJfcHJnKTsKKwlrZnJlZShkLT5pdF9wcmcpOworCWtmcmVlKGQtPmJ1ZmZlcl9zdGF0dXMpOworCWtmcmVlKGQtPmJ1ZmZlcl9wcmdfYXNzaWdubWVudCk7CisJa2ZyZWUoZC0+YnVmZmVyX3RpbWUpOworCWtmcmVlKGQtPmxhc3RfdXNlZF9jbWQpOworCWtmcmVlKGQtPm5leHRfYnVmZmVyKTsKIAlsaXN0X2RlbCgmZC0+bGluayk7Ci0KIAlrZnJlZShkKTsKIAogCXJldHVybiAwOwpAQCAtMjMwLDcgKzIyNyw3IEBACiAJLyogSW5pdCB0aGUgcmVnaW9ucyBmb3IgZWFzeSBjbGVhbnVwICovCiAJZG1hX3JlZ2lvbl9pbml0KCZkLT5kbWEpOwogCi0JaWYgKGRtYV9yZWdpb25fYWxsb2MoJmQtPmRtYSwgZC0+bnVtX2Rlc2MgKiBkLT5idWZfc2l6ZSwgb2hjaS0+ZGV2LAorCWlmIChkbWFfcmVnaW9uX2FsbG9jKCZkLT5kbWEsIChkLT5udW1fZGVzYyAtIDEpICogZC0+YnVmX3NpemUsIG9oY2ktPmRldiwKIAkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKSkgewogCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlciIpOwogCQlmcmVlX2RtYV9pc29fY3R4KGQpOwpAQCAtMzQyLDYgKzMzOSw4IEBACiAKIAlkLT5idWZmZXJfc3RhdHVzID0ga21hbGxvYyhkLT5udW1fZGVzYyAqIHNpemVvZih1bnNpZ25lZCBpbnQpLAogCQkJCSAgIEdGUF9LRVJORUwpOworCWQtPmJ1ZmZlcl9wcmdfYXNzaWdubWVudCA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKIAlkLT5idWZmZXJfdGltZSA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2Yoc3RydWN0IHRpbWV2YWwpLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWQtPmxhc3RfdXNlZF9jbWQgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKHVuc2lnbmVkIGludCksCkBAIC0zNTQsNiArMzUzLDExIEBACiAJCWZyZWVfZG1hX2lzb19jdHgoZCk7CiAJCXJldHVybiBOVUxMOwogCX0KKwlpZiAoZC0+YnVmZmVyX3ByZ19hc3NpZ25tZW50ID09IE5VTEwpIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcl9wcmdfYXNzaWdubWVudCIpOworCQlmcmVlX2RtYV9pc29fY3R4KGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJaWYgKGQtPmJ1ZmZlcl90aW1lID09IE5VTEwpIHsKIAkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcl90aW1lIik7CiAJCWZyZWVfZG1hX2lzb19jdHgoZCk7CkBAIC0zNzAsNiArMzc0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW1lbXNldChkLT5idWZmZXJfc3RhdHVzLCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwltZW1zZXQoZC0+YnVmZmVyX3ByZ19hc3NpZ25tZW50LCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKIAltZW1zZXQoZC0+YnVmZmVyX3RpbWUsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CiAJbWVtc2V0KGQtPmxhc3RfdXNlZF9jbWQsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogCW1lbXNldChkLT5uZXh0X2J1ZmZlciwgLTEsIGQtPm51bV9kZXNjICogc2l6ZW9mKGludCkpOwpAQCAtMzc5LDcgKzM4NCw3IEBACiAJUFJJTlQoS0VSTl9JTkZPLCBvaGNpLT5ob3N0LT5pZCwgIklzbyAlcyBETUE6ICVkIGJ1ZmZlcnMgIgogCSAgICAgICJvZiBzaXplICVkIGFsbG9jYXRlZCBmb3IgYSBmcmFtZSBzaXplICVkLCBlYWNoIHdpdGggJWQgcHJncyIsCiAJICAgICAgKHR5cGUgPT0gT0hDSV9JU09fUkVDRUlWRSkgPyAicmVjZWl2ZSIgOiAidHJhbnNtaXQiLAotCSAgICAgIGQtPm51bV9kZXNjLCBkLT5idWZfc2l6ZSwgZC0+ZnJhbWVfc2l6ZSwgZC0+bmJfY21kKTsKKwkgICAgICBkLT5udW1fZGVzYyAtIDEsIGQtPmJ1Zl9zaXplLCBkLT5mcmFtZV9zaXplLCBkLT5uYl9jbWQpOwogCiAJcmV0dXJuIGQ7CiB9CkBAIC0zOTQsMTEgKzM5OSwzNiBAQAogCWQtPmlyX3ByZ1tuXVtpXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihkLT5sZWZ0X3NpemUpOwogfQogCitzdGF0aWMgdm9pZCByZXByb2dyYW1fZG1hX2lyX3ByZyhzdHJ1Y3QgZG1hX2lzb19jdHggKmQsIGludCBuLCBpbnQgYnVmZmVyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGRtYV9jbWQgKmlyX3ByZyA9IGQtPmlyX3ByZ1tuXTsKKwl1bnNpZ25lZCBsb25nIGJ1ZiA9ICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCArIGJ1ZmZlciAqIGQtPmJ1Zl9zaXplOworCWludCBpOworCisJZC0+YnVmZmVyX3ByZ19hc3NpZ25tZW50W25dID0gYnVmZmVyOworCisJaXJfcHJnWzBdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwgYnVmIC0KKyAgCSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworCWlyX3ByZ1sxXS5hZGRyZXNzID0gY3B1X3RvX2xlMzIoZG1hX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5kbWEsCisJCQkJKGJ1ZiArIDQpIC0gKHVuc2lnbmVkIGxvbmcpZC0+ZG1hLmt2aXJ0KSk7CisKKwlmb3IgKGk9MjtpPGQtPm5iX2NtZC0xO2krKykgeworCQlpcl9wcmdbaV0uYWRkcmVzcyA9IGNwdV90b19sZTMyKGRtYV9yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+ZG1hLAorCQkJCQkJKGJ1ZisoaS0xKSpQQUdFX1NJWkUpIC0KKwkJCQkJCSh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworCX0KKworCWlyX3ByZ1tpXS5jb250cm9sID0gY3B1X3RvX2xlMzIoRE1BX0NUTF9JTlBVVF9NT1JFIHwgRE1BX0NUTF9VUERBVEUgfAorCQkJCSAgRE1BX0NUTF9JUlEgfCBETUFfQ1RMX0JSQU5DSCB8IGQtPmxlZnRfc2l6ZSk7CisJaXJfcHJnW2ldLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwKKwkJCQkgIChidWYrKGktMSkqUEFHRV9TSVpFKSAtICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworfQorCiBzdGF0aWMgdm9pZCBpbml0aWFsaXplX2RtYV9pcl9wcmcoc3RydWN0IGRtYV9pc29fY3R4ICpkLCBpbnQgbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBkbWFfY21kICppcl9wcmcgPSBkLT5pcl9wcmdbbl07CiAJc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqaXJfcmVnID0gJmQtPnByZ19yZWdbbl07Ci0JdW5zaWduZWQgbG9uZyBidWYgPSAodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQgKyBuICogZC0+YnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyBidWYgPSAodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQ7CiAJaW50IGk7CiAKIAkvKiB0aGUgZmlyc3QgZGVzY3JpcHRvciB3aWxsIHJlYWQgb25seSA0IGJ5dGVzICovCkBAIC01MDgsNyArNTM4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2Rlc2M7IGkrKykgewogCQlpZiAoZC0+aXJfcHJnW2ldW2QtPm5iX2NtZC0xXS5zdGF0dXMgJiBjcHVfdG9fbGUzMigweEZGRkYwMDAwKSkgewogCQkJcmVzZXRfaXJfc3RhdHVzKGQsIGkpOwotCQkJZC0+YnVmZmVyX3N0YXR1c1tpXSA9IFZJREVPMTM5NF9CVUZGRVJfUkVBRFk7CisJCQlkLT5idWZmZXJfc3RhdHVzW2QtPmJ1ZmZlcl9wcmdfYXNzaWdubWVudFtpXV0gPSBWSURFTzEzOTRfQlVGRkVSX1JFQURZOwogCQkJZG9fZ2V0dGltZW9mZGF5KCZkLT5idWZmZXJfdGltZVtpXSk7CiAJCX0KIAl9CkBAIC01ODUsNyArNjE1LDcgQEAKIAkJCWludCBuZXh0ID0gZC0+bmV4dF9idWZmZXJbaV07CiAJCQlwdXRfdGltZXN0YW1wKG9oY2ksIGQsIG5leHQpOwogCQkJZC0+aXRfcHJnW2ldW2QtPmxhc3RfdXNlZF9jbWRbaV1dLmVuZC5zdGF0dXMgPSAwOwotCQkJZC0+YnVmZmVyX3N0YXR1c1tpXSA9IFZJREVPMTM5NF9CVUZGRVJfUkVBRFk7CisJCQlkLT5idWZmZXJfc3RhdHVzW2QtPmJ1ZmZlcl9wcmdfYXNzaWdubWVudFtpXV0gPSBWSURFTzEzOTRfQlVGRkVSX1JFQURZOwogCQl9CiAJfQogCkBAIC01OTUsMTEgKzYyNSwyNSBAQAogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmQtPndhaXRxKTsKIH0KIAorc3RhdGljIHZvaWQgcmVwcm9ncmFtX2RtYV9pdF9wcmcoc3RydWN0IGRtYV9pc29fY3R4ICAqZCwgaW50IG4sIGludCBidWZmZXIpCit7CisJc3RydWN0IGl0X2RtYV9wcmcgKml0X3ByZyA9IGQtPml0X3ByZ1tuXTsKKwl1bnNpZ25lZCBsb25nIGJ1ZiA9ICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCArIGJ1ZmZlciAqIGQtPmJ1Zl9zaXplOworCWludCBpOworCisJZC0+YnVmZmVyX3ByZ19hc3NpZ25tZW50W25dID0gYnVmZmVyOworCWZvciAoaT0wO2k8ZC0+bmJfY21kO2krKykgeworCSAgaXRfcHJnW2ldLmVuZC5hZGRyZXNzID0KKwkJY3B1X3RvX2xlMzIoZG1hX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5kbWEsCisJCQkoYnVmK2kqZC0+cGFja2V0X3NpemUpIC0gKHVuc2lnbmVkIGxvbmcpZC0+ZG1hLmt2aXJ0KSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpbml0aWFsaXplX2RtYV9pdF9wcmcoc3RydWN0IGRtYV9pc29fY3R4ICpkLCBpbnQgbiwgaW50IHN5bmNfdGFnKQogewogCXN0cnVjdCBpdF9kbWFfcHJnICppdF9wcmcgPSBkLT5pdF9wcmdbbl07CiAJc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqaXRfcmVnID0gJmQtPnByZ19yZWdbbl07Ci0JdW5zaWduZWQgbG9uZyBidWYgPSAodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQgKyBuICogZC0+YnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyBidWYgPSAodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQ7CiAJaW50IGk7CiAJZC0+bGFzdF91c2VkX2NtZFtuXSA9IGQtPm5iX2NtZCAtIDE7CiAJZm9yIChpPTA7aTxkLT5uYl9jbWQ7aSsrKSB7CkBAIC03OTYsNyArODQwLDcgQEAKIAogCQlpZiAoY21kID09IFZJREVPMTM5NF9JT0NfTElTVEVOX0NIQU5ORUwpIHsKIAkJCWQgPSBhbGxvY19kbWFfaXNvX2N0eChvaGNpLCBPSENJX0lTT19SRUNFSVZFLAotCQkJCQkgICAgICB2Lm5iX2J1ZmZlcnMsIHYuYnVmX3NpemUsCisJCQkJCSAgICAgIHYubmJfYnVmZmVycyArIDEsIHYuYnVmX3NpemUsCiAJCQkJCSAgICAgIHYuY2hhbm5lbCwgMCk7CiAKIAkJCWlmIChkID09IE5VTEwpIHsKQEAgLTgxNyw3ICs4NjEsNyBAQAogCQl9CiAJCWVsc2UgewogCQkJZCA9IGFsbG9jX2RtYV9pc29fY3R4KG9oY2ksIE9IQ0lfSVNPX1RSQU5TTUlULAotCQkJCQkgICAgICB2Lm5iX2J1ZmZlcnMsIHYuYnVmX3NpemUsCisJCQkJCSAgICAgIHYubmJfYnVmZmVycyArIDEsIHYuYnVmX3NpemUsCiAJCQkJCSAgICAgIHYuY2hhbm5lbCwgdi5wYWNrZXRfc2l6ZSk7CiAKIAkJCWlmIChkID09IE5VTEwpIHsKQEAgLTg4OSw2ICs5MzMsNyBAQAogCXsKIAkJc3RydWN0IHZpZGVvMTM5NF93YWl0IHY7CiAJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKKwkJaW50IG5leHRfcHJnOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtODk2LDcgKzk0MSw3IEBACiAJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1JFQ0VJVkUsIHYuY2hhbm5lbCk7CiAJCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOwogCi0JCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPmQtPm51bV9kZXNjKSkgeworCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj49ZC0+bnVtX2Rlc2MgLSAxKSkgewogCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAogCQkJICAgICAgIkJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2UiLHYuYnVmZmVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtOTEzLDEyICs5NTgsMTQgQEAKIAogCQlkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXT1WSURFTzEzOTRfQlVGRkVSX1FVRVVFRDsKIAorCQluZXh0X3ByZyA9IChkLT5sYXN0X2J1ZmZlciArIDEpICUgZC0+bnVtX2Rlc2M7CiAJCWlmIChkLT5sYXN0X2J1ZmZlcj49MCkKIAkJCWQtPmlyX3ByZ1tkLT5sYXN0X2J1ZmZlcl1bZC0+bmJfY21kLTFdLmJyYW5jaEFkZHJlc3MgPQotCQkJCWNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+cHJnX3JlZ1t2LmJ1ZmZlcl0sIDApCisJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW25leHRfcHJnXSwgMCkKIAkJCQkJJiAweGZmZmZmZmYwKSB8IDB4MSk7CiAKLQkJZC0+bGFzdF9idWZmZXIgPSB2LmJ1ZmZlcjsKKwkJZC0+bGFzdF9idWZmZXIgPSBuZXh0X3ByZzsKKwkJcmVwcm9ncmFtX2RtYV9pcl9wcmcoZCwgZC0+bGFzdF9idWZmZXIsIHYuYnVmZmVyLCBkLT5mbGFncyk7CiAKIAkJZC0+aXJfcHJnW2QtPmxhc3RfYnVmZmVyXVtkLT5uYl9jbWQtMV0uYnJhbmNoQWRkcmVzcyA9IDA7CiAKQEAgLTkzMCw3ICs5NzcsNyBAQAogCiAJCQkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBmaXJzdCBwcm9ncmFtIGlzICovCiAJCQlyZWdfd3JpdGUob2hjaSwgZC0+Y21kUHRyLAotCQkJCWRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW3YuYnVmZmVyXSwgMCkgfCAweDEpOworCQkJCSAgZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJmQtPnByZ19yZWdbZC0+bGFzdF9idWZmZXJdLCAwKSB8IDB4MSk7CiAKIAkJCS8qIFJ1biBJUiBjb250ZXh0ICovCiAJCQlyZWdfd3JpdGUob2hjaSwgZC0+Y3RybFNldCwgMHg4MDAwKTsKQEAgLTk1MSw3ICs5OTgsNyBAQAogCXsKIAkJc3RydWN0IHZpZGVvMTM5NF93YWl0IHY7CiAJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKLQkJaW50IGk7CisJCWludCBpID0gMDsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZ3AsIHNpemVvZih2KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTk1OSw3ICsxMDA2LDcgQEAKIAkJZCA9IGZpbmRfY3R4KCZjdHgtPmNvbnRleHRfbGlzdCwgT0hDSV9JU09fUkVDRUlWRSwgdi5jaGFubmVsKTsKIAkJaWYgKGQgPT0gTlVMTCkgcmV0dXJuIC1FRkFVTFQ7CiAKLQkJaWYgKCh2LmJ1ZmZlcjwwKSB8fCAodi5idWZmZXI+ZC0+bnVtX2Rlc2MpKSB7CisJCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPmQtPm51bV9kZXNjIC0gMSkpIHsKIAkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKIAkJCSAgICAgICJCdWZmZXIgJWQgb3V0IG9mIHJhbmdlIix2LmJ1ZmZlcik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMDUsOSArMTA1Miw5IEBACiAJCSAqIExvb2sgYWhlYWQgdG8gc2VlIGhvdyBtYW55IG1vcmUgYnVmZmVycyBoYXZlIGJlZW4gcmVjZWl2ZWQKIAkJICovCiAJCWk9MDsKLQkJd2hpbGUgKGQtPmJ1ZmZlcl9zdGF0dXNbKHYuYnVmZmVyKzEpJWQtPm51bV9kZXNjXT09CisJCXdoaWxlIChkLT5idWZmZXJfc3RhdHVzWyh2LmJ1ZmZlcisxKSUoZC0+bnVtX2Rlc2MgLSAxKV09PQogCQkgICAgICAgVklERU8xMzk0X0JVRkZFUl9SRUFEWSkgewotCQkJdi5idWZmZXI9KHYuYnVmZmVyKzEpJWQtPm51bV9kZXNjOworCQkJdi5idWZmZXI9KHYuYnVmZmVyKzEpJShkLT5udW1fZGVzYyAtIDEpOwogCQkJaSsrOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKQEAgLTEwMjMsNiArMTA3MCw3IEBACiAJCXN0cnVjdCB2aWRlbzEzOTRfd2FpdCB2OwogCQl1bnNpZ25lZCBpbnQgKnBzaXplcyA9IE5VTEw7CiAJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKKwkJaW50IG5leHRfcHJnOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTAzMCw3ICsxMDc4LDcgQEAKIAkJZCA9IGZpbmRfY3R4KCZjdHgtPmNvbnRleHRfbGlzdCwgT0hDSV9JU09fVFJBTlNNSVQsIHYuY2hhbm5lbCk7CiAJCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOwogCi0JCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPmQtPm51bV9kZXNjKSkgeworCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj49ZC0+bnVtX2Rlc2MgLSAxKSkgewogCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAogCQkJICAgICAgIkJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2UiLHYuYnVmZmVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA1NiwxOSArMTEwNCwxOSBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLGZsYWdzKTsKIAorCQkvLyBsYXN0X2J1ZmZlciBpcyBsYXN0X3ByZworCQluZXh0X3ByZyA9IChkLT5sYXN0X2J1ZmZlciArIDEpICUgZC0+bnVtX2Rlc2M7CiAJCWlmIChkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXSE9VklERU8xMzk0X0JVRkZFUl9GUkVFKSB7CiAJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCiAJCQkgICAgICAiQnVmZmVyICVkIGlzIGFscmVhZHkgdXNlZCIsdi5idWZmZXIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jayxmbGFncyk7Ci0JCQlpZiAocHNpemVzKQotCQkJCWtmcmVlKHBzaXplcyk7CisJCQlrZnJlZShwc2l6ZXMpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCiAJCWlmIChkLT5mbGFncyAmIFZJREVPMTM5NF9WQVJJQUJMRV9QQUNLRVRfU0laRSkgewogCQkJaW5pdGlhbGl6ZV9kbWFfaXRfcHJnX3Zhcl9wYWNrZXRfcXVldWUoCi0JCQkJZCwgdi5idWZmZXIsIHBzaXplcywKLQkJCQlvaGNpKTsKKwkJCQlkLCBuZXh0X3ByZywgcHNpemVzLCBvaGNpKTsKIAkJfQogCiAJCWQtPmJ1ZmZlcl9zdGF0dXNbdi5idWZmZXJdPVZJREVPMTM5NF9CVUZGRVJfUVVFVUVEOwpAQCAtMTA3NiwxNiArMTEyNCwxNyBAQAogCQlpZiAoZC0+bGFzdF9idWZmZXIgPj0gMCkgewogCQkJZC0+aXRfcHJnW2QtPmxhc3RfYnVmZmVyXQogCQkJCVsgZC0+bGFzdF91c2VkX2NtZFtkLT5sYXN0X2J1ZmZlcl0gXS5lbmQuYnJhbmNoQWRkcmVzcyA9Ci0JCQkJCWNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+cHJnX3JlZ1t2LmJ1ZmZlcl0sCisJCQkJCWNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+cHJnX3JlZ1tuZXh0X3ByZ10sCiAJCQkJCQkwKSAmIDB4ZmZmZmZmZjApIHwgMHgzKTsKIAogCQkJZC0+aXRfcHJnW2QtPmxhc3RfYnVmZmVyXQogCQkJCVsgZC0+bGFzdF91c2VkX2NtZFtkLT5sYXN0X2J1ZmZlcl0gXS5iZWdpbi5icmFuY2hBZGRyZXNzID0KLQkJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW3YuYnVmZmVyXSwKKwkJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW25leHRfcHJnXSwKIAkJCQkJCTApICYgMHhmZmZmZmZmMCkgfCAweDMpOwotCQkJZC0+bmV4dF9idWZmZXJbZC0+bGFzdF9idWZmZXJdID0gdi5idWZmZXI7CisJCQlkLT5uZXh0X2J1ZmZlcltkLT5sYXN0X2J1ZmZlcl0gPSAodi5idWZmZXIgKyAxKSAlIChkLT5udW1fZGVzYyAtIDEpOwogCQl9Ci0JCWQtPmxhc3RfYnVmZmVyID0gdi5idWZmZXI7CisJCWQtPmxhc3RfYnVmZmVyID0gbmV4dF9wcmc7CisJCXJlcHJvZ3JhbV9kbWFfaXRfcHJnKGQsIGQtPmxhc3RfYnVmZmVyLCB2LmJ1ZmZlcik7CiAJCWQtPm5leHRfYnVmZmVyW2QtPmxhc3RfYnVmZmVyXSA9IC0xOwogCiAJCWQtPml0X3ByZ1tkLT5sYXN0X2J1ZmZlcl1bZC0+bGFzdF91c2VkX2NtZFtkLT5sYXN0X2J1ZmZlcl1dLmVuZC5icmFuY2hBZGRyZXNzID0gMDsKQEAgLTExMDAsNyArMTE0OSw3IEBACiAKIAkJCS8qIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGZpcnN0IHByb2dyYW0gaXMgKi8KIAkJCXJlZ193cml0ZShvaGNpLCBkLT5jbWRQdHIsCi0JCQkJZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJmQtPnByZ19yZWdbdi5idWZmZXJdLCAwKSB8IDB4Myk7CisJCQkJZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJmQtPnByZ19yZWdbbmV4dF9wcmddLCAwKSB8IDB4Myk7CiAKIAkJCS8qIFJ1biBJVCBjb250ZXh0ICovCiAJCQlyZWdfd3JpdGUob2hjaSwgZC0+Y3RybFNldCwgMHg4MDAwKTsKQEAgLTExMTYsOSArMTE2NSw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAocHNpemVzKQotCQkJa2ZyZWUocHNpemVzKTsKLQorCQlrZnJlZShwc2l6ZXMpOwogCQlyZXR1cm4gMDsKIAogCX0KQEAgLTExMzMsNyArMTE4MCw3IEBACiAJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1RSQU5TTUlULCB2LmNoYW5uZWwpOwogCQlpZiAoZCA9PSBOVUxMKSByZXR1cm4gLUVGQVVMVDsKIAotCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj5kLT5udW1fZGVzYykpIHsKKwkJaWYgKCh2LmJ1ZmZlcjwwKSB8fCAodi5idWZmZXI+PWQtPm51bV9kZXNjLTEpKSB7CiAJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCiAJCQkgICAgICAiQnVmZmVyICVkIG91dCBvZiByYW5nZSIsdi5idWZmZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYwppbmRleCBkNDIzM2VlLi4yNzZlMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCiAJaW5pdF9tYWQocXVlcnktPnNhX3F1ZXJ5Lm1hZCwgYWdlbnQpOwogCi0JcXVlcnktPnNhX3F1ZXJ5LmNhbGxiYWNrICAgICAgICAgICAgICA9IGliX3NhX3BhdGhfcmVjX2NhbGxiYWNrOworCXF1ZXJ5LT5zYV9xdWVyeS5jYWxsYmFjayAgICAgICAgICAgICAgPSBjYWxsYmFjayA/IGliX3NhX3BhdGhfcmVjX2NhbGxiYWNrIDogTlVMTDsKIAlxdWVyeS0+c2FfcXVlcnkucmVsZWFzZSAgICAgICAgICAgICAgID0gaWJfc2FfcGF0aF9yZWNfcmVsZWFzZTsKIAlxdWVyeS0+c2FfcXVlcnkucG9ydCAgICAgICAgICAgICAgICAgID0gcG9ydDsKIAlxdWVyeS0+c2FfcXVlcnkubWFkLT5tYWRfaGRyLm1ldGhvZCAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwpAQCAtNjYzLDcgKzY2Myw3IEBACiAKIAlpbml0X21hZChxdWVyeS0+c2FfcXVlcnkubWFkLCBhZ2VudCk7CiAKLQlxdWVyeS0+c2FfcXVlcnkuY2FsbGJhY2sgICAgICAgICAgICAgID0gaWJfc2FfbWNtZW1iZXJfcmVjX2NhbGxiYWNrOworCXF1ZXJ5LT5zYV9xdWVyeS5jYWxsYmFjayAgICAgICAgICAgICAgPSBjYWxsYmFjayA/IGliX3NhX21jbWVtYmVyX3JlY19jYWxsYmFjayA6IE5VTEw7CiAJcXVlcnktPnNhX3F1ZXJ5LnJlbGVhc2UgICAgICAgICAgICAgICA9IGliX3NhX21jbWVtYmVyX3JlY19yZWxlYXNlOwogCXF1ZXJ5LT5zYV9xdWVyeS5wb3J0ICAgICAgICAgICAgICAgICAgPSBwb3J0OwogCXF1ZXJ5LT5zYV9xdWVyeS5tYWQtPm1hZF9oZHIubWV0aG9kICAgPSBtZXRob2Q7CkBAIC02OTgsMjAgKzY5OCwyMSBAQAogCWlmICghcXVlcnkpCiAJCXJldHVybjsKIAotCXN3aXRjaCAobWFkX3NlbmRfd2MtPnN0YXR1cykgewotCWNhc2UgSUJfV0NfU1VDQ0VTUzoKLQkJLyogTm8gY2FsbGJhY2sgLS0gYWxyZWFkeSBnb3QgcmVjdiAqLwotCQlicmVhazsKLQljYXNlIElCX1dDX1JFU1BfVElNRU9VVF9FUlI6Ci0JCXF1ZXJ5LT5jYWxsYmFjayhxdWVyeSwgLUVUSU1FRE9VVCwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgSUJfV0NfV1JfRkxVU0hfRVJSOgotCQlxdWVyeS0+Y2FsbGJhY2socXVlcnksIC1FSU5UUiwgTlVMTCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXF1ZXJ5LT5jYWxsYmFjayhxdWVyeSwgLUVJTywgTlVMTCk7Ci0JCWJyZWFrOwotCX0KKwlpZiAocXVlcnktPmNhbGxiYWNrKQorCQlzd2l0Y2ggKG1hZF9zZW5kX3djLT5zdGF0dXMpIHsKKwkJY2FzZSBJQl9XQ19TVUNDRVNTOgorCQkJLyogTm8gY2FsbGJhY2sgLS0gYWxyZWFkeSBnb3QgcmVjdiAqLworCQkJYnJlYWs7CisJCWNhc2UgSUJfV0NfUkVTUF9USU1FT1VUX0VSUjoKKwkJCXF1ZXJ5LT5jYWxsYmFjayhxdWVyeSwgLUVUSU1FRE9VVCwgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBJQl9XQ19XUl9GTFVTSF9FUlI6CisJCQlxdWVyeS0+Y2FsbGJhY2socXVlcnksIC1FSU5UUiwgTlVMTCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXF1ZXJ5LT5jYWxsYmFjayhxdWVyeSwgLUVJTywgTlVMTCk7CisJCQlicmVhazsKKwkJfQogCiAJZG1hX3VubWFwX3NpbmdsZShhZ2VudC0+ZGV2aWNlLT5kbWFfZGV2aWNlLAogCQkJIHBjaV91bm1hcF9hZGRyKHF1ZXJ5LCBtYXBwaW5nKSwKQEAgLTczNiw3ICs3MzcsNyBAQAogCXF1ZXJ5ID0gaWRyX2ZpbmQoJnF1ZXJ5X2lkciwgbWFkX3JlY3Zfd2MtPndjLT53cl9pZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRyX2xvY2ssIGZsYWdzKTsKIAotCWlmIChxdWVyeSkgeworCWlmIChxdWVyeSAmJiBxdWVyeS0+Y2FsbGJhY2spIHsKIAkJaWYgKG1hZF9yZWN2X3djLT53Yy0+c3RhdHVzID09IElCX1dDX1NVQ0NFU1MpCiAJCQlxdWVyeS0+Y2FsbGJhY2socXVlcnksCiAJCQkJCW1hZF9yZWN2X3djLT5yZWN2X2J1Zi5tYWQtPm1hZF9oZHIuc3RhdHVzID8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCmluZGV4IDU2YjljMmYuLjlkOTEyZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYwpAQCAtNDk5LDYgKzQ5OSw3IEBACiBzdGF0aWMgaW50IGliX3VtYWRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGliX3VtYWRfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWJfdW1hZF9wYWNrZXQgKnBhY2tldCwgKnRtcDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBJQl9VTUFEX01BWF9BR0VOVFM7ICsraSkKQEAgLTUwNyw2ICs1MDgsOSBAQAogCQkJaWJfdW5yZWdpc3Rlcl9tYWRfYWdlbnQoZmlsZS0+YWdlbnRbaV0pOwogCQl9CiAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCB0bXAsICZmaWxlLT5yZWN2X2xpc3QsIGxpc3QpCisJCWtmcmVlKHBhY2tldCk7CisKIAlrZnJlZShmaWxlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfc2EuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3NhLmgKaW5kZXggZjRmNzQ3Ny4uMDAyMjIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfc2EuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl9zYS5oCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkvKiByZXNlcnZlZCAqLwogCXU4ICAgICAgICAgICBzbDsKIAl1OCAgICAgICAgICAgbXR1X3NlbGVjdG9yOwotCWVudW0gaWJfbXR1ICBtdHU7CisJdTggICAgICAgICAgIG10dTsKIAl1OCAgICAgICAgICAgcmF0ZV9zZWxlY3RvcjsKIAl1OCAgICAgICAgICAgcmF0ZTsKIAl1OCAgICAgICAgICAgcGFja2V0X2xpZmVfdGltZV9zZWxlY3RvcjsKQEAgLTE4MCw3ICsxODAsNyBAQAogCXUzMiAgICAgICAgICBxa2V5OwogCXUxNiAgICAgICAgICBtbGlkOwogCXU4ICAgICAgICAgICBtdHVfc2VsZWN0b3I7Ci0JZW51bSAgICAgICAgIGliX210dSBtdHU7CisJdTggICAgICAgICAgIG10dTsKIAl1OCAgICAgICAgICAgdHJhZmZpY19jbGFzczsKIAl1MTYgICAgICAgICAgcGtleTsKIAl1OCAJICAgICByYXRlX3NlbGVjdG9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IGZmNjZlZDQuLjc5YzMzMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTQ2NSw4ICs0NjUsMTAgQEAKIAkJCWlmIChhdGtiZC0+c29mdHJlcGVhdCkgcmV0dXJuIDA7CiAKIAkJCWkgPSBqID0gMDsKLQkJCXdoaWxlIChpIDwgMzIgJiYgcGVyaW9kW2ldIDwgZGV2LT5yZXBbUkVQX1BFUklPRF0pIGkrKzsKLQkJCXdoaWxlIChqIDwgNCAmJiBkZWxheVtqXSA8IGRldi0+cmVwW1JFUF9ERUxBWV0pIGorKzsKKwkJCXdoaWxlIChpIDwgMzEgJiYgcGVyaW9kW2ldIDwgZGV2LT5yZXBbUkVQX1BFUklPRF0pCisJCQkJaSsrOworCQkJd2hpbGUgKGogPCAzICYmIGRlbGF5W2pdIDwgZGV2LT5yZXBbUkVQX0RFTEFZXSkKKwkJCQlqKys7CiAJCQlkZXYtPnJlcFtSRVBfUEVSSU9EXSA9IHBlcmlvZFtpXTsKIAkJCWRldi0+cmVwW1JFUF9ERUxBWV0gPSBkZWxheVtqXTsKIAkJCXBhcmFtWzBdID0gaSB8IChqIDw8IDUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCAxZjg1YTk3Li40MmE5ZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtMzQxLDYgKzM0MSw4IEBACiAJdW5zaWduZWQgY2hhciBwYXJhbVs0XTsKIAlpbnQgdmVyc2lvbjsKIAorCXBzbW91c2VfcmVzZXQocHNtb3VzZSk7CisKIAlpZiAoIShwcml2LT5pID0gYWxwc19nZXRfbW9kZWwocHNtb3VzZSwgJnZlcnNpb24pKSkKIAkJcmV0dXJuIC0xOwogCkBAIC0zOTUsNyArMzk3LDcgQEAKIAl9CiAKIAlpZiAocGFyYW1bMF0gJiAweDA0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiAgRW5hYmxpbmcgaGFyZHdhcmUgdGFwcGluZ1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gImFscHMuYzogRW5hYmxpbmcgaGFyZHdhcmUgdGFwcGluZ1xuIik7CiAJCWlmIChhbHBzX3RhcF9tb2RlKHBzbW91c2UsIDEpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxwcy5jOiBGYWlsZWQgdG8gZW5hYmxlIGhhcmR3YXJlIHRhcHBpbmdcbiIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCAzMzEzZTJkLi4wYmVhY2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC0zODgsNiArMzg4LDI0IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAyeFxuIiwgc2VyaW8tPmlkLmV4dHJhKTsKIH0KIAorc3RhdGljIERFVklDRV9BVFRSKHR5cGUsIFNfSVJVR08sIHNlcmlvX3Nob3dfaWRfdHlwZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJvdG8sIFNfSVJVR08sIHNlcmlvX3Nob3dfaWRfcHJvdG8sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGlkLCBTX0lSVUdPLCBzZXJpb19zaG93X2lkX2lkLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihleHRyYSwgU19JUlVHTywgc2VyaW9fc2hvd19pZF9leHRyYSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzZXJpb19kZXZpY2VfaWRfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9wcm90by5hdHRyLAorCSZkZXZfYXR0cl9pZC5hdHRyLAorCSZkZXZfYXR0cl9leHRyYS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNlcmlvX2lkX2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUJPSAiaWQiLAorCS5hdHRycwk9IHNlcmlvX2RldmljZV9pZF9hdHRycywKK307CisKIHN0YXRpYyBzc2l6ZV90IHNlcmlvX3JlYmluZF9kcml2ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gdG9fc2VyaW9fcG9ydChkZXYpOwpAQCAtNDQ0LDEwICs0NjIsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2VyaW9fZGV2aWNlX2F0dHJzW10gPSB7CiAJX19BVFRSKGRlc2NyaXB0aW9uLCBTX0lSVUdPLCBzZXJpb19zaG93X2Rlc2NyaXB0aW9uLCBOVUxMKSwKLQlfX0FUVFIoaWRfdHlwZSwgU19JUlVHTywgc2VyaW9fc2hvd19pZF90eXBlLCBOVUxMKSwKLQlfX0FUVFIoaWRfcHJvdG8sIFNfSVJVR08sIHNlcmlvX3Nob3dfaWRfcHJvdG8sIE5VTEwpLAotCV9fQVRUUihpZF9pZCwgU19JUlVHTywgc2VyaW9fc2hvd19pZF9pZCwgTlVMTCksCi0JX19BVFRSKGlkX2V4dHJhLCBTX0lSVUdPLCBzZXJpb19zaG93X2lkX2V4dHJhLCBOVUxMKSwKIAlfX0FUVFIoZHJ2Y3RsLCBTX0lXVVNSLCBOVUxMLCBzZXJpb19yZWJpbmRfZHJpdmVyKSwKIAlfX0FUVFIoYmluZF9tb2RlLCBTX0lXVVNSIHwgU19JUlVHTywgc2VyaW9fc2hvd19iaW5kX21vZGUsIHNlcmlvX3NldF9iaW5kX21vZGUpLAogCV9fQVRUUl9OVUxMCkBAIC00OTgsNiArNTEyLDcgQEAKIAlpZiAoc2VyaW8tPnN0YXJ0KQogCQlzZXJpby0+c3RhcnQoc2VyaW8pOwogCWRldmljZV9hZGQoJnNlcmlvLT5kZXYpOworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmc2VyaW9faWRfYXR0cl9ncm91cCk7CiAJc2VyaW8tPnJlZ2lzdGVyZWQgPSAxOwogfQogCkBAIC01MjYsNiArNTQxLDcgQEAKIAl9CiAKIAlpZiAoc2VyaW8tPnJlZ2lzdGVyZWQpIHsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZXJpby0+ZGV2LmtvYmosICZzZXJpb19pZF9hdHRyX2dyb3VwKTsKIAkJZGV2aWNlX2RlbCgmc2VyaW8tPmRldik7CiAJCWxpc3RfZGVsX2luaXQoJnNlcmlvLT5ub2RlKTsKIAkJc2VyaW8tPnJlZ2lzdGVyZWQgPSAwOwpAQCAtNzc5LDcgKzc5NSw2IEBACiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHRvX3NlcmlvX3BvcnQoZGV2KTsKIAogCWlmICghc2VyaW8tPmRydiB8fCAhc2VyaW8tPmRydi0+cmVjb25uZWN0IHx8IHNlcmlvLT5kcnYtPnJlY29ubmVjdChzZXJpbykpIHsKLQkJc2VyaW9fZGlzY29ubmVjdF9wb3J0KHNlcmlvKTsKIAkJLyoKIAkJICogRHJpdmVyIHJlLXByb2JpbmcgY2FuIHRha2UgYSB3aGlsZSwgc28gYmV0dGVyIGxldCBrc2VyaW9kCiAJCSAqIGRlYWwgd2l0aCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKaW5kZXggMjJmNzM2OC4uZjZiODUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKQEAgLTI3LDExICsyNywxNSBAQAogTU9EVUxFX0FMSUFTX0xESVNDKE5fTU9VU0UpOwogCiAjZGVmaW5lIFNFUlBPUlRfQlVTWQkxCisjZGVmaW5lIFNFUlBPUlRfQUNUSVZFCTIKKyNkZWZpbmUgU0VSUE9SVF9ERUFECTMKIAogc3RydWN0IHNlcnBvcnQgewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOworCXN0cnVjdCBzZXJpb19kZXZpY2VfaWQgaWQ7CisJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCkBAIC00NSwxMSArNDksMjkgQEAKIAlyZXR1cm4gLShzZXJwb3J0LT50dHktPmRyaXZlci0+d3JpdGUoc2VycG9ydC0+dHR5LCAmZGF0YSwgMSkgIT0gMSk7CiB9CiAKK3N0YXRpYyBpbnQgc2VycG9ydF9zZXJpb19vcGVuKHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJc3RydWN0IHNlcnBvcnQgKnNlcnBvcnQgPSBzZXJpby0+cG9ydF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VycG9ydC0+bG9jaywgZmxhZ3MpOworCXNldF9iaXQoU0VSUE9SVF9BQ1RJVkUsICZzZXJwb3J0LT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VycG9ydC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgc2VycG9ydF9zZXJpb19jbG9zZShzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQogewogCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gc2VyaW8tPnBvcnRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2VycG9ydC0+c2VyaW8tPmlkLnR5cGUgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJwb3J0LT5sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KFNFUlBPUlRfQUNUSVZFLCAmc2VycG9ydC0+ZmxhZ3MpOworCXNldF9iaXQoU0VSUE9SVF9ERUFELCAmc2VycG9ydC0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VycG9ydC0+d2FpdCk7CiB9CiAKQEAgLTYxLDM2ICs4MywyMSBAQAogc3RhdGljIGludCBzZXJwb3J0X2xkaXNjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3Qgc2VycG9ydCAqc2VycG9ydDsKLQlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwotCWNoYXIgbmFtZVs2NF07CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzZXJwb3J0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcnBvcnQpLCBHRlBfS0VSTkVMKTsKLQlzZXJpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghc2VycG9ydCB8fCAhc2VyaW8pKSB7Ci0JCWtmcmVlKHNlcnBvcnQpOwotCQlrZnJlZShzZXJpbyk7CisJc2VycG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJwb3J0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKLQltZW1zZXQoc2VycG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSk7Ci0Jc2VycG9ydC0+c2VyaW8gPSBzZXJpbzsKLQlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKIAlzZXJwb3J0LT50dHkgPSB0dHk7Ci0JdHR5LT5kaXNjX2RhdGEgPSBzZXJwb3J0OwotCi0JbWVtc2V0KHNlcmlvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlvKSk7Ci0Jc3RybGNweShzZXJpby0+bmFtZSwgIlNlcmlhbCBwb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7Ci0Jc25wcmludGYoc2VyaW8tPnBoeXMsIHNpemVvZihzZXJpby0+cGh5cyksICIlcy9zZXJpbzAiLCB0dHlfbmFtZSh0dHksIG5hbWUpKTsKLQlzZXJpby0+aWQudHlwZSA9IFNFUklPX1JTMjMyOwotCXNlcmlvLT53cml0ZSA9IHNlcnBvcnRfc2VyaW9fd3JpdGU7Ci0Jc2VyaW8tPmNsb3NlID0gc2VycG9ydF9zZXJpb19jbG9zZTsKLQlzZXJpby0+cG9ydF9kYXRhID0gc2VycG9ydDsKLQorCXNwaW5fbG9ja19pbml0KCZzZXJwb3J0LT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJwb3J0LT53YWl0KTsKIAorCXR0eS0+ZGlzY19kYXRhID0gc2VycG9ydDsKKwlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDAsNyArMTA3LDggQEAKIAogc3RhdGljIHZvaWQgc2VycG9ydF9sZGlzY19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0KikgdHR5LT5kaXNjX2RhdGE7CisJc3RydWN0IHNlcnBvcnQgKnNlcnBvcnQgPSAoc3RydWN0IHNlcnBvcnQgKikgdHR5LT5kaXNjX2RhdGE7CisKIAlrZnJlZShzZXJwb3J0KTsKIH0KIApAQCAtMTE2LDkgKzEyNCwxOSBAQAogc3RhdGljIHZvaWQgc2VycG9ydF9sZGlzY19yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0KikgdHR5LT5kaXNjX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXRlc3RfYml0KFNFUlBPUlRfQUNUSVZFLCAmc2VycG9ydC0+ZmxhZ3MpKQorCQlnb3RvIG91dDsKKwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogCQlzZXJpb19pbnRlcnJ1cHQoc2VycG9ydC0+c2VyaW8sIGNwW2ldLCAwLCBOVUxMKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTE0MSwxNiArMTU5LDMzIEBACiBzdGF0aWMgc3NpemVfdCBzZXJwb3J0X2xkaXNjX3JlYWQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBucikKIHsKIAlzdHJ1Y3Qgc2VycG9ydCAqc2VycG9ydCA9IChzdHJ1Y3Qgc2VycG9ydCopIHR0eS0+ZGlzY19kYXRhOworCXN0cnVjdCBzZXJpbyAqc2VyaW87CiAJY2hhciBuYW1lWzY0XTsKIAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFUlBPUlRfQlVTWSwgJnNlcnBvcnQtPmZsYWdzKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCXNlcnBvcnQtPnNlcmlvID0gc2VyaW8gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcmlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmxjcHkoc2VyaW8tPm5hbWUsICJTZXJpYWwgcG9ydCIsIHNpemVvZihzZXJpby0+bmFtZSkpOworCXNucHJpbnRmKHNlcmlvLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLCAiJXMvc2VyaW8wIiwgdHR5X25hbWUodHR5LCBuYW1lKSk7CisJc2VyaW8tPmlkID0gc2VycG9ydC0+aWQ7CisJc2VyaW8tPmlkLnR5cGUgPSBTRVJJT19SUzIzMjsKKwlzZXJpby0+d3JpdGUgPSBzZXJwb3J0X3NlcmlvX3dyaXRlOworCXNlcmlvLT5vcGVuID0gc2VycG9ydF9zZXJpb19vcGVuOworCXNlcmlvLT5jbG9zZSA9IHNlcnBvcnRfc2VyaW9fY2xvc2U7CisJc2VyaW8tPnBvcnRfZGF0YSA9IHNlcnBvcnQ7CisKIAlzZXJpb19yZWdpc3Rlcl9wb3J0KHNlcnBvcnQtPnNlcmlvKTsKIAlwcmludGsoS0VSTl9JTkZPICJzZXJpbzogU2VyaWFsIHBvcnQgJXNcbiIsIHR0eV9uYW1lKHR0eSwgbmFtZSkpOwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJwb3J0LT53YWl0LCAhc2VycG9ydC0+c2VyaW8tPmlkLnR5cGUpOwotCXNlcmlvX3VucmVnaXN0ZXJfcG9ydChzZXJwb3J0LT5zZXJpbyk7CiAKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VycG9ydC0+d2FpdCwgdGVzdF9iaXQoU0VSUE9SVF9ERUFELCAmc2VycG9ydC0+ZmxhZ3MpKTsKKwlzZXJpb191bnJlZ2lzdGVyX3BvcnQoc2VycG9ydC0+c2VyaW8pOworCXNlcnBvcnQtPnNlcmlvID0gTlVMTDsKKworCWNsZWFyX2JpdChTRVJQT1JUX0RFQUQsICZzZXJwb3J0LT5mbGFncyk7CiAJY2xlYXJfYml0KFNFUlBPUlRfQlVTWSwgJnNlcnBvcnQtPmZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMTYzLDE2ICsxOTgsMTUgQEAKIHN0YXRpYyBpbnQgc2VycG9ydF9sZGlzY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc2VycG9ydCAqc2VycG9ydCA9IChzdHJ1Y3Qgc2VycG9ydCopIHR0eS0+ZGlzY19kYXRhOwotCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSBzZXJwb3J0LT5zZXJpbzsKIAl1bnNpZ25lZCBsb25nIHR5cGU7CiAKIAlpZiAoY21kID09IFNQSU9DU1RZUEUpIHsKIAkJaWYgKGdldF91c2VyKHR5cGUsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJc2VyaW8tPmlkLnByb3RvCT0gdHlwZSAmIDB4MDAwMDAwZmY7Ci0JCXNlcmlvLT5pZC5pZAk9ICh0eXBlICYgMHgwMDAwZmYwMCkgPj4gODsKLQkJc2VyaW8tPmlkLmV4dHJhCT0gKHR5cGUgJiAweDAwZmYwMDAwKSA+PiAxNjsKKwkJc2VycG9ydC0+aWQucHJvdG8gPSB0eXBlICYgMHgwMDAwMDBmZjsKKwkJc2VycG9ydC0+aWQuaWQJICA9ICh0eXBlICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJc2VycG9ydC0+aWQuZXh0cmEgPSAodHlwZSAmIDB4MDBmZjAwMDApID4+IDE2OwogCiAJCXJldHVybiAwOwogCX0KQEAgLTE4Miw5ICsyMTYsMTMgQEAKIAogc3RhdGljIHZvaWQgc2VycG9ydF9sZGlzY193cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCiB7Ci0Jc3RydWN0IHNlcnBvcnQgKnNwID0gKHN0cnVjdCBzZXJwb3J0ICopIHR0eS0+ZGlzY19kYXRhOworCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0ICopIHR0eS0+ZGlzY19kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzZXJpb19kcnZfd3JpdGVfd2FrZXVwKHNwLT5zZXJpbyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAodGVzdF9iaXQoU0VSUE9SVF9BQ1RJVkUsICZzZXJwb3J0LT5mbGFncykpCisJCXNlcmlvX2Rydl93cml0ZV93YWtldXAoc2VycG9ydC0+c2VyaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCBlMGFjNjNlLi5kMDkzMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC0zOSwxNSArMzksMTYgQEAKICNkZWZpbmUgTUFOVUFMX01BU0sgIDB4ZTAKICNkZWZpbmUgQVVUT19NQVNLICAgIDB4MjAKIAotc3RhdGljIHU4IFRFTVBfUkVHWzNdICAgID0gezB4MjYsIDB4MjUsIDB4Mjd9OyAvKiBsb2NhbCwgY3B1LCBncHUgKi8KLXN0YXRpYyB1OCBMSU1JVF9SRUdbM10gICA9IHsweDZiLCAweDZhLCAweDZjfTsgLyogbG9jYWwsIGNwdSwgZ3B1ICovCitzdGF0aWMgdTggVEVNUF9SRUdbM10gICAgPSB7MHgyNiwgMHgyNSwgMHgyN307IC8qIGxvY2FsLCBzZW5zb3IxLCBzZW5zb3IyICovCitzdGF0aWMgdTggTElNSVRfUkVHWzNdICAgPSB7MHg2YiwgMHg2YSwgMHg2Y307IC8qIGxvY2FsLCBzZW5zb3IxLCBzZW5zb3IyICovCiBzdGF0aWMgdTggTUFOVUFMX01PREVbMl0gPSB7MHg1YywgMHg1ZH07ICAgICAgIAogc3RhdGljIHU4IFJFTV9DT05UUk9MWzJdID0gezB4MDAsIDB4NDB9Owogc3RhdGljIHU4IEZBTl9TUEVFRFsyXSAgID0gezB4MjgsIDB4MmF9Owogc3RhdGljIHU4IEZBTl9TUERfU0VUWzJdID0gezB4MzAsIDB4MzF9OwogCi1zdGF0aWMgdTggZGVmYXVsdF9saW1pdHNfbG9jYWxbM10gPSB7NzAsIDUwLCA3MH07ICAgIC8qIGxvY2FsLCBjcHUsIGdwdSAqLwotc3RhdGljIHU4IGRlZmF1bHRfbGltaXRzX2NoaXBbM10gPSB7ODAsIDY1LCA4MH07ICAgIC8qIGxvY2FsLCBjcHUsIGdwdSAqLworc3RhdGljIHU4IGRlZmF1bHRfbGltaXRzX2xvY2FsWzNdID0gezcwLCA1MCwgNzB9OyAgICAvKiBsb2NhbCwgc2Vuc29yMSwgc2Vuc29yMiAqLworc3RhdGljIHU4IGRlZmF1bHRfbGltaXRzX2NoaXBbM10gPSB7ODAsIDY1LCA4MH07ICAgIC8qIGxvY2FsLCBzZW5zb3IxLCBzZW5zb3IyICovCitzdGF0aWMgY2hhciAqc2Vuc29yX2xvY2F0aW9uWzNdID0ge05VTEwsIE5VTEwsIE5VTEx9OwogCiBzdGF0aWMgaW50IGxpbWl0X2FkanVzdCA9IDA7CiBzdGF0aWMgaW50IGZhbl9zcGVlZCA9IC0xOwpAQCAtNTgsNyArNTksNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBtb2R1bGVfcGFyYW0obGltaXRfYWRqdXN0LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhsaW1pdF9hZGp1c3QsIkFkanVzdCBtYXhpbXVtIHRlbXBlcmF0dXJlcyAoNTAgY3B1LCA3MCBncHUpICIKK01PRFVMRV9QQVJNX0RFU0MobGltaXRfYWRqdXN0LCJBZGp1c3QgbWF4aW11bSB0ZW1wZXJhdHVyZXMgKDUwIHNlbnNvcjEsIDcwIHNlbnNvcjIpICIKIAkJICJieSBOIGRlZ3JlZXMuIik7CiAKIG1vZHVsZV9wYXJhbShmYW5fc3BlZWQsIGludCwgMDY0NCk7CkBAIC0yMTMsMTAgKzIxNCwxMCBAQAogCWlmICh0aC0+bGFzdF9zcGVlZFtmYW5dICE9IHNwZWVkKSB7CiAJCWlmIChzcGVlZCA9PSAtMSkKIAkJCXByaW50ayhLRVJOX0RFQlVHICJhZHQ3NDZ4OiBTZXR0aW5nIHNwZWVkIHRvIGF1dG9tYXRpYyAiCi0JCQkJImZvciAlcyBmYW4uXG4iLCBmYW4/IkdQVSI6IkNQVSIpOworCQkJCSJmb3IgJXMgZmFuLlxuIiwgc2Vuc29yX2xvY2F0aW9uW2ZhbisxXSk7CiAJCWVsc2UKIAkJCXByaW50ayhLRVJOX0RFQlVHICJhZHQ3NDZ4OiBTZXR0aW5nIHNwZWVkIHRvICVkICIKLQkJCQkiZm9yICVzIGZhbi5cbiIsIHNwZWVkLCBmYW4/IkdQVSI6IkNQVSIpOworCQkJCSJmb3IgJXMgZmFuLlxuIiwgc3BlZWQsIHNlbnNvcl9sb2NhdGlvbltmYW4rMV0pOwogCX0gZWxzZQogCQlyZXR1cm47CiAJCkBAIC0zMDAsMTEgKzMwMSwxMSBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgImFkdDc0Nng6IHNldHRpbmcgZmFucyBzcGVlZCB0byAlZCAiCiAJCQkJCSAiKGxpbWl0IGV4Y2VlZGVkIGJ5ICVkIG9uICVzKSBcbiIsCiAJCQkJCW5ld19zcGVlZCwgdmFyLAotCQkJCQlmYW5fbnVtYmVyPyJHUFUvcHdyIjoiQ1BVIik7CisJCQkJCXNlbnNvcl9sb2NhdGlvbltmYW5fbnVtYmVyKzFdKTsKIAkJCXdyaXRlX2JvdGhfZmFuX3NwZWVkKHRoLCBuZXdfc3BlZWQpOwogCQkJdGgtPmxhc3RfdmFyW2Zhbl9udW1iZXJdID0gdmFyOwogCQl9IGVsc2UgaWYgKHZhciA8IC0yKSB7Ci0JCQkvKiBkb24ndCBzdG9wIGZhbiBpZiBHUFUvcG93ZXIgaXMgY29sZCBhbmQgQ1BVIGlzIG5vdAorCQkJLyogZG9uJ3Qgc3RvcCBmYW4gaWYgc2Vuc29yMiBpcyBjb2xkIGFuZCBzZW5zb3IxIGlzIG5vdAogCQkJICogc28gY29sZCAobGFzdHZhciA+PSAtMSkgKi8KIAkJCWlmIChpID09IDIgJiYgbGFzdHZhciA8IC0xKSB7CiAJCQkJaWYgKHRoLT5sYXN0X3NwZWVkW2Zhbl9udW1iZXJdICE9IDApCkBAIC0zMTgsNyArMzE5LDcgQEAKIAogCQlpZiAoc3RhcnRlZCkKIAkJCXJldHVybjsgLyogd2UgZG9uJ3Qgd2FudCB0byByZS1zdG9wIHRoZSBmYW4KLQkJCQkqIGlmIENQVSBpcyBoZWF0aW5nIGFuZCBHUFUvcG93ZXIgaXMgbm90ICovCisJCQkJKiBpZiBzZW5zb3IxIGlzIGhlYXRpbmcgYW5kIHNlbnNvcjIgaXMgbm90ICovCiAJfQogfQogCkBAIC0zNTMsNyArMzU0LDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X2xpbWl0KHN0cnVjdCB0aGVybW9zdGF0ICp0aCwgaW50IGkpCiB7Ci0JCS8qIFNldCBDUFUgbGltaXQgaGlnaGVyIHRvIGF2b2lkIHBvd2VyZG93bnMgKi8gCisJCS8qIFNldCBzZW5zb3IxIGxpbWl0IGhpZ2hlciB0byBhdm9pZCBwb3dlcmRvd25zICovCiAJCXRoLT5saW1pdHNbaV0gPSBkZWZhdWx0X2xpbWl0c19jaGlwW2ldICsgbGltaXRfYWRqdXN0OwogCQl3cml0ZV9yZWcodGgsIExJTUlUX1JFR1tpXSwgdGgtPmxpbWl0c1tpXSk7CiAJCQpAQCAtNDYxLDYgKzQ2MiwxMiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsJCQlcCiB9CiAKKyNkZWZpbmUgQlVJTERfU0hPV19GVU5DX1NUUihuYW1lLCBkYXRhKQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkYXRhKTsJCQlcCit9CisKICNkZWZpbmUgQlVJTERfU0hPV19GVU5DX0ZBTihuYW1lLCBkYXRhKQkJCQlcCiBzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgICAgICAgXAogewkJCQkJCQkJXApAQCAtNDc2LDcgKzQ4Myw3IEBACiAJaW50IHZhbDsJCQkJCQlcCiAJaW50IGk7CQkJCQkJCVwKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwkJCVwKLQlwcmludGsoS0VSTl9JTkZPICJBZGp1c3RpbmcgbGltaXRzIGJ5ICVksENcbiIsIHZhbCk7CVwKKwlwcmludGsoS0VSTl9JTkZPICJBZGp1c3RpbmcgbGltaXRzIGJ5ICVkIGRlZ3JlZXNcbiIsIHZhbCk7CVwKIAlsaW1pdF9hZGp1c3QgPSB2YWw7CQkJCQlcCiAJZm9yIChpPTA7IGkgPCAzOyBpKyspCQkJCQlcCiAJCXNldF9saW1pdCh0aGVybW9zdGF0LCBpKTsJCQlcCkBAIC00OTUsMzUgKzUwMiw0MSBAQAogCXJldHVybiBuOwkJCQkJCVwKIH0KIAotQlVJTERfU0hPV19GVU5DX0lOVChjcHVfdGVtcGVyYXR1cmUsCSAocmVhZF9yZWcodGhlcm1vc3RhdCwgVEVNUF9SRUdbMV0pKSkKLUJVSUxEX1NIT1dfRlVOQ19JTlQoZ3B1X3RlbXBlcmF0dXJlLAkgKHJlYWRfcmVnKHRoZXJtb3N0YXQsIFRFTVBfUkVHWzJdKSkpCi1CVUlMRF9TSE9XX0ZVTkNfSU5UKGNwdV9saW1pdCwJCSB0aGVybW9zdGF0LT5saW1pdHNbMV0pCi1CVUlMRF9TSE9XX0ZVTkNfSU5UKGdwdV9saW1pdCwJCSB0aGVybW9zdGF0LT5saW1pdHNbMl0pCitCVUlMRF9TSE9XX0ZVTkNfSU5UKHNlbnNvcjFfdGVtcGVyYXR1cmUsCSAocmVhZF9yZWcodGhlcm1vc3RhdCwgVEVNUF9SRUdbMV0pKSkKK0JVSUxEX1NIT1dfRlVOQ19JTlQoc2Vuc29yMl90ZW1wZXJhdHVyZSwJIChyZWFkX3JlZyh0aGVybW9zdGF0LCBURU1QX1JFR1syXSkpKQorQlVJTERfU0hPV19GVU5DX0lOVChzZW5zb3IxX2xpbWl0LAkJIHRoZXJtb3N0YXQtPmxpbWl0c1sxXSkKK0JVSUxEX1NIT1dfRlVOQ19JTlQoc2Vuc29yMl9saW1pdCwJCSB0aGVybW9zdGF0LT5saW1pdHNbMl0pCitCVUlMRF9TSE9XX0ZVTkNfU1RSKHNlbnNvcjFfbG9jYXRpb24sCQkgc2Vuc29yX2xvY2F0aW9uWzFdKQorQlVJTERfU0hPV19GVU5DX1NUUihzZW5zb3IyX2xvY2F0aW9uLAkJIHNlbnNvcl9sb2NhdGlvblsyXSkKIAogQlVJTERfU0hPV19GVU5DX0lOVChzcGVjaWZpZWRfZmFuX3NwZWVkLCBmYW5fc3BlZWQpCi1CVUlMRF9TSE9XX0ZVTkNfRkFOKGNwdV9mYW5fc3BlZWQsCSAwKQotQlVJTERfU0hPV19GVU5DX0ZBTihncHVfZmFuX3NwZWVkLAkgMSkKK0JVSUxEX1NIT1dfRlVOQ19GQU4oc2Vuc29yMV9mYW5fc3BlZWQsCSAwKQorQlVJTERfU0hPV19GVU5DX0ZBTihzZW5zb3IyX2Zhbl9zcGVlZCwJIDEpCiAKIEJVSUxEX1NUT1JFX0ZVTkNfSU5UKHNwZWNpZmllZF9mYW5fc3BlZWQsZmFuX3NwZWVkKQogQlVJTERfU0hPV19GVU5DX0lOVChsaW1pdF9hZGp1c3QsCSBsaW1pdF9hZGp1c3QpCiBCVUlMRF9TVE9SRV9GVU5DX0RFRyhsaW1pdF9hZGp1c3QsCSB0aGVybW9zdGF0KQogCQkKLXN0YXRpYyBERVZJQ0VfQVRUUihjcHVfdGVtcGVyYXR1cmUsCVNfSVJVR08sCi0JCSAgIHNob3dfY3B1X3RlbXBlcmF0dXJlLE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGdwdV90ZW1wZXJhdHVyZSwJU19JUlVHTywKLQkJICAgc2hvd19ncHVfdGVtcGVyYXR1cmUsTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY3B1X2xpbWl0LAkJU19JUlVHTywKLQkJICAgc2hvd19jcHVfbGltaXQsCU5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGdwdV9saW1pdCwJCVNfSVJVR08sCi0JCSAgIHNob3dfZ3B1X2xpbWl0LAlOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzZW5zb3IxX3RlbXBlcmF0dXJlLAlTX0lSVUdPLAorCQkgICBzaG93X3NlbnNvcjFfdGVtcGVyYXR1cmUsTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2Vuc29yMl90ZW1wZXJhdHVyZSwJU19JUlVHTywKKwkJICAgc2hvd19zZW5zb3IyX3RlbXBlcmF0dXJlLE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNlbnNvcjFfbGltaXQsIFNfSVJVR08sCisJCSAgIHNob3dfc2Vuc29yMV9saW1pdCwJTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2Vuc29yMl9saW1pdCwgU19JUlVHTywKKwkJICAgc2hvd19zZW5zb3IyX2xpbWl0LAlOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzZW5zb3IxX2xvY2F0aW9uLCBTX0lSVUdPLAorCQkgICBzaG93X3NlbnNvcjFfbG9jYXRpb24sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNlbnNvcjJfbG9jYXRpb24sIFNfSVJVR08sCisJCSAgIHNob3dfc2Vuc29yMl9sb2NhdGlvbiwgTlVMTCk7CiAKIHN0YXRpYyBERVZJQ0VfQVRUUihzcGVjaWZpZWRfZmFuX3NwZWVkLAlTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lST1RILAogCQkgICBzaG93X3NwZWNpZmllZF9mYW5fc3BlZWQsc3RvcmVfc3BlY2lmaWVkX2Zhbl9zcGVlZCk7CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihjcHVfZmFuX3NwZWVkLAlTX0lSVUdPLAotCQkgICBzaG93X2NwdV9mYW5fc3BlZWQsCU5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGdwdV9mYW5fc3BlZWQsCVNfSVJVR08sCi0JCSAgIHNob3dfZ3B1X2Zhbl9zcGVlZCwJTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2Vuc29yMV9mYW5fc3BlZWQsCVNfSVJVR08sCisJCSAgIHNob3dfc2Vuc29yMV9mYW5fc3BlZWQsCU5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNlbnNvcjJfZmFuX3NwZWVkLAlTX0lSVUdPLAorCQkgICBzaG93X3NlbnNvcjJfZmFuX3NwZWVkLAlOVUxMKTsKIAogc3RhdGljIERFVklDRV9BVFRSKGxpbWl0X2FkanVzdCwJU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JUk9USCwKIAkJICAgc2hvd19saW1pdF9hZGp1c3QsCXN0b3JlX2xpbWl0X2FkanVzdCk7CkBAIC01MzQsNiArNTQ3LDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wOwogCXUzMiAqcHJvcDsKKwlpbnQgaSA9IDAsIG9mZnNldCA9IDA7CiAJCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZmFuIik7CiAJaWYgKCFucCkKQEAgLTU0NSw2ICs1NTksMTIgQEAKIAllbHNlCiAJCXJldHVybiAtRU5PREVWOwogCisJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJod3NlbnNvci1wYXJhbXMtdmVyc2lvbiIsIE5VTEwpOworCXByaW50ayhLRVJOX0lORk8gImFkdDc0Nng6IHZlcnNpb24gJWQgKCVzc3VwcG9ydGVkKVxuIiwgKnByb3AsCisJCQkgKCpwcm9wID09IDEpPyIiOiJ1biIpOworCWlmICgqcHJvcCAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CiAJaWYgKCFwcm9wKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTU2Myw2ICs1ODMsMjMgQEAKIAkJCSAibGltaXRfYWRqdXN0OiAlZCwgZmFuX3NwZWVkOiAlZFxuIiwKIAkJCSB0aGVybV9idXMsIHRoZXJtX2FkZHJlc3MsIGxpbWl0X2FkanVzdCwgZmFuX3NwZWVkKTsKIAorCWlmIChnZXRfcHJvcGVydHkobnAsICJod3NlbnNvci1sb2NhdGlvbiIsIE5VTEwpKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXNlbnNvcl9sb2NhdGlvbltpXSA9IGdldF9wcm9wZXJ0eShucCwKKwkJCQkJImh3c2Vuc29yLWxvY2F0aW9uIiwgTlVMTCkgKyBvZmZzZXQ7CisKKwkJCWlmIChzZW5zb3JfbG9jYXRpb25baV0gPT0gTlVMTCkKKwkJCQlzZW5zb3JfbG9jYXRpb25baV0gPSAiIjsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2Vuc29yICVkOiAlc1xuIiwgaSwgc2Vuc29yX2xvY2F0aW9uW2ldKTsKKwkJCW9mZnNldCArPSBzdHJsZW4oc2Vuc29yX2xvY2F0aW9uW2ldKSArIDE7CisJCX0KKwl9IGVsc2UgeworCQlzZW5zb3JfbG9jYXRpb25bMF0gPSAiPyI7CisJCXNlbnNvcl9sb2NhdGlvblsxXSA9ICI/IjsKKwkJc2Vuc29yX2xvY2F0aW9uWzJdID0gIj8iOworCX0KKwogCW9mX2RldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ0ZW1wZXJhdHVyZXMiKTsKIAkKIAlpZiAob2ZfZGV2ID09IE5VTEwpIHsKQEAgLTU3MCwxNSArNjA3LDE3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAkKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3B1X3RlbXBlcmF0dXJlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfZ3B1X3RlbXBlcmF0dXJlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3B1X2xpbWl0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfZ3B1X2xpbWl0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMV90ZW1wZXJhdHVyZSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjJfdGVtcGVyYXR1cmUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX2xpbWl0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMl9saW1pdCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjFfbG9jYXRpb24pOworCWRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IyX2xvY2F0aW9uKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfbGltaXRfYWRqdXN0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc3BlY2lmaWVkX2Zhbl9zcGVlZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX2NwdV9mYW5fc3BlZWQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX2Zhbl9zcGVlZCk7CiAJaWYodGhlcm1fdHlwZSA9PSBBRFQ3NDYwKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfZ3B1X2Zhbl9zcGVlZCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IyX2Zhbl9zcGVlZCk7CiAKICNpZm5kZWYgQ09ORklHX0kyQ19LRVlXRVNUCiAJcmVxdWVzdF9tb2R1bGUoImkyYy1rZXl3ZXN0Iik7CkBAIC01OTEsMTcgKzYzMCwxOSBAQAogdGhlcm1vc3RhdF9leGl0KHZvaWQpCiB7CiAJaWYgKG9mX2RldikgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3B1X3RlbXBlcmF0dXJlKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX2dwdV90ZW1wZXJhdHVyZSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9jcHVfbGltaXQpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfZ3B1X2xpbWl0KTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjFfdGVtcGVyYXR1cmUpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMl90ZW1wZXJhdHVyZSk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX2xpbWl0KTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjJfbGltaXQpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMV9sb2NhdGlvbik7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IyX2xvY2F0aW9uKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX2xpbWl0X2FkanVzdCk7CiAJCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zcGVjaWZpZWRfZmFuX3NwZWVkKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX2NwdV9mYW5fc3BlZWQpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMV9mYW5fc3BlZWQpOwogCiAJCWlmKHRoZXJtX3R5cGUgPT0gQURUNzQ2MCkKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZfZGV2LT5kZXYsCi0JCQkJCSAgICZkZXZfYXR0cl9ncHVfZmFuX3NwZWVkKTsKKwkJCQkJICAgJmRldl9hdHRyX3NlbnNvcjJfZmFuX3NwZWVkKTsKIAogCQlvZl9kZXZpY2VfdW5yZWdpc3RlcihvZl9kZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbGluZWFyLmMgYi9kcml2ZXJzL21kL2xpbmVhci5jCmluZGV4IDE2MWU5YWEuLmIxOTQxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbGluZWFyLmMKKysrIGIvZHJpdmVycy9tZC9saW5lYXIuYwpAQCAtMjY5LDkgKzI2OSw4IEBACiAJCSAqIHNwbGl0IGl0LgogCQkgKi8KIAkJc3RydWN0IGJpb19wYWlyICpicDsKLQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBiaW9fc3BsaXRfcG9vbCwgCi0JCQkgICAgICAgKGJpby0+Ymlfc2VjdG9yICsgKGJpby0+Ymlfc2l6ZSA+PiA5KSAtCi0JCQkJKHRtcF9kZXYtPm9mZnNldCArIHRtcF9kZXYtPnNpemUpKTw8MSk7CisJCWJwID0gYmlvX3NwbGl0KGJpbywgYmlvX3NwbGl0X3Bvb2wsCisJCQkgICAgICAgKCh0bXBfZGV2LT5vZmZzZXQgKyB0bXBfZGV2LT5zaXplKTw8MSkgLSBiaW8tPmJpX3NlY3Rvcik7CiAJCWlmIChsaW5lYXJfbWFrZV9yZXF1ZXN0KHEsICZicC0+YmlvMSkpCiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdCgmYnAtPmJpbzEpOwogCQlpZiAobGluZWFyX21ha2VfcmVxdWVzdChxLCAmYnAtPmJpbzIpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKaW5kZXggNGU0YmZkZS4uMmFlMmQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYworKysgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCkBAIC00NjIsMTAgKzQ2Miw2IEBACiAJfQogCW1lbXNldChjb25mLT5tdWx0aXBhdGhzLCAwLCBzaXplb2Yoc3RydWN0IG11bHRpcGF0aF9pbmZvKSptZGRldi0+cmFpZF9kaXNrcyk7CiAKLQltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IG11bHRpcGF0aF91bnBsdWc7Ci0KLQltZGRldi0+cXVldWUtPmlzc3VlX2ZsdXNoX2ZuID0gbXVsdGlwYXRoX2lzc3VlX2ZsdXNoOwotCiAJY29uZi0+d29ya2luZ19kaXNrcyA9IDA7CiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7CiAJCWRpc2tfaWR4ID0gcmRldi0+cmFpZF9kaXNrOwpAQCAtNTI4LDYgKzUyNCwxMCBAQAogCSAqIE9rLCBldmVyeXRoaW5nIGlzIGp1c3QgZmluZSBub3cKIAkgKi8KIAltZGRldi0+YXJyYXlfc2l6ZSA9IG1kZGV2LT5zaXplOworCisJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSBtdWx0aXBhdGhfdW5wbHVnOworCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSBtdWx0aXBhdGhfaXNzdWVfZmx1c2g7CisKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWVfY29uZjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCA4MzM4MGI1Li4xZGI1ZGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0xMTk3LDEwICsxMTk3LDYgQEAKIAlpZiAoIWNvbmYtPnIxYmlvX3Bvb2wpCiAJCWdvdG8gb3V0X25vX21lbTsKIAotCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gcmFpZDFfdW5wbHVnOwotCi0JbWRkZXYtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IHJhaWQxX2lzc3VlX2ZsdXNoOwotCiAJSVRFUkFURV9SREVWKG1kZGV2LCByZGV2LCB0bXApIHsKIAkJZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChkaXNrX2lkeCA+PSBtZGRldi0+cmFpZF9kaXNrcwpAQCAtMTI4Miw2ICsxMjc4LDkgQEAKIAkgKi8KIAltZGRldi0+YXJyYXlfc2l6ZSA9IG1kZGV2LT5zaXplOwogCisJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkMV91bnBsdWc7CisJbWRkZXYtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IHJhaWQxX2lzc3VlX2ZsdXNoOworCiAJcmV0dXJuIDA7CiAKIG91dF9ub19tZW06CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCBlOWRjMjg3Li4zYzM3YmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTE2MzksOSArMTYzOSw2IEBACiAJCQltZG5hbWUobWRkZXYpKTsKIAkJZ290byBvdXRfZnJlZV9jb25mOwogCX0KLQltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQxMF91bnBsdWc7Ci0KLQltZGRldi0+cXVldWUtPmlzc3VlX2ZsdXNoX2ZuID0gcmFpZDEwX2lzc3VlX2ZsdXNoOwogCiAJSVRFUkFURV9SREVWKG1kZGV2LCByZGV2LCB0bXApIHsKIAkJZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CkBAIC0xNzEzLDYgKzE3MTAsOSBAQAogCW1kZGV2LT5hcnJheV9zaXplID0gc2l6ZS8yOwogCW1kZGV2LT5yZXN5bmNfbWF4X3NlY3RvcnMgPSBzaXplOwogCisJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkMTBfdW5wbHVnOworCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSByYWlkMTBfaXNzdWVfZmx1c2g7CisKIAkvKiBDYWxjdWxhdGUgbWF4IHJlYWQtYWhlYWQgc2l6ZS4KIAkgKiBXZSBuZWVkIHRvIHJlYWRhaGVhZCBhdCBsZWFzdCB0d2ljZSBhIHdob2xlIHN0cmlwZS4uLi4KIAkgKiBtYXliZS4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IGU5NmUyYTEuLjNjYjExYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTE2MjAsOSArMTYyMCw2IEBACiAJYXRvbWljX3NldCgmY29uZi0+YWN0aXZlX3N0cmlwZXMsIDApOwogCWF0b21pY19zZXQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMsIDApOwogCi0JbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkNV91bnBsdWdfZGV2aWNlOwotCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSByYWlkNV9pc3N1ZV9mbHVzaDsKLQogCVBSSU5USygicmFpZDU6IHJ1biglcykgY2FsbGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKQEAgLTE3MjgsNiArMTcyNSwxMCBAQAogCX0KIAogCS8qIE9rLCBldmVyeXRoaW5nIGlzIGp1c3QgZmluZSBub3cgKi8KKworCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gcmFpZDVfdW5wbHVnX2RldmljZTsKKwltZGRldi0+cXVldWUtPmlzc3VlX2ZsdXNoX2ZuID0gcmFpZDVfaXNzdWVfZmx1c2g7CisKIAltZGRldi0+YXJyYXlfc2l6ZSA9ICBtZGRldi0+c2l6ZSAqIChtZGRldi0+cmFpZF9kaXNrcyAtIDEpOwogCXJldHVybiAwOwogYWJvcnQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jIGIvZHJpdmVycy9tZC9yYWlkNm1haW4uYwppbmRleCA4YTMzZjM1Li45MDhlZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMKQEAgLTE3NzksOSArMTc3OSw2IEBACiAJYXRvbWljX3NldCgmY29uZi0+YWN0aXZlX3N0cmlwZXMsIDApOwogCWF0b21pY19zZXQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMsIDApOwogCi0JbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkNl91bnBsdWdfZGV2aWNlOwotCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSByYWlkNl9pc3N1ZV9mbHVzaDsKLQogCVBSSU5USygicmFpZDY6IHJ1biglcykgY2FsbGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKQEAgLTE4OTUsNiArMTg5Miw5IEBACiAKIAkvKiBPaywgZXZlcnl0aGluZyBpcyBqdXN0IGZpbmUgbm93ICovCiAJbWRkZXYtPmFycmF5X3NpemUgPSAgbWRkZXYtPnNpemUgKiAobWRkZXYtPnJhaWRfZGlza3MgLSAyKTsKKworCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gcmFpZDZfdW5wbHVnX2RldmljZTsKKwltZGRldi0+cXVldWUtPmlzc3VlX2ZsdXNoX2ZuID0gcmFpZDZfaXNzdWVfZmx1c2g7CiAJcmV0dXJuIDA7CiBhYm9ydDoKIAlpZiAoY29uZikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwppbmRleCA5ZjZjMTlhLi41MGU4Yjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwpAQCAtMjMsOSArMjMsOSBAQAogTElTVF9IRUFEKHNhYTcxNDZfZGV2aWNlcyk7CiBERUNMQVJFX01VVEVYKHNhYTcxNDZfZGV2aWNlc19sb2NrKTsKIAotc3RhdGljIGludCBzYWE3MTQ2X251bSA9IDA7CitzdGF0aWMgaW50IHNhYTcxNDZfbnVtOwogCi11bnNpZ25lZCBpbnQgc2FhNzE0Nl9kZWJ1ZyA9IDA7Cit1bnNpZ25lZCBpbnQgc2FhNzE0Nl9kZWJ1ZzsKIAogbW9kdWxlX3BhcmFtKHNhYTcxNDZfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNhYTcxNDZfZGVidWcsICJkZWJ1ZyBsZXZlbCAoZGVmYXVsdDogMCkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCmluZGV4IDg4M2VjMDguLjQ5ODNlMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwpAQCAtMzMsNyArMzMsNyBAQAogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZyIKIAogY29tbWVudCAiU3VwcG9ydGVkIEZsZXhDb3BJSSAoQjJDMikgQWRhcHRlcnMiCi0JZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIChQQ0kgfHwgVVNCKQogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWciCiAKIGNvbW1lbnQgIlN1cHBvcnRlZCBCVDg3OCBBZGFwdGVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZwppbmRleCA1MjU5NjkwLi45OWJkNjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCkBAIC0xLDMgKzEsNDAgQEAKK2NvbmZpZyBEVkJfQjJDMl9GTEVYQ09QCisJdHJpc3RhdGUgIlRlY2huaXNhdC9CMkMyIEZsZXhDb3BJSShiKSBhbmQgRmxleENvcElJSSBhZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJc2VsZWN0IERWQl9TVFYwMjk5CisJc2VsZWN0IERWQl9NVDM1MgorCXNlbGVjdCBEVkJfTVQzMTIKKwlzZWxlY3QgRFZCX05YVDIwMDIKKwlzZWxlY3QgRFZCX1NUVjAyOTcKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgZGlnaXRhbCBUViByZWNlaXZlciBjaGlwIG1hZGUgYnkgQjJDMiBJbmMuIGluY2x1ZGVkIGluCisJICBUZWNobmlzYXRzIFBDSSBjYXJkcyBhbmQgVVNCIGJveGVzLgorCisJICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBkZXZpY2UgYW5kIHdhbnQgdG8gdXNlIGl0LgorCitjb25maWcgRFZCX0IyQzJfRkxFWENPUF9QQ0kKKwl0cmlzdGF0ZSAiVGVjaG5pc2F0L0IyQzIgQWlyL1NreS9DYWJsZTJQQyBQQ0kiCisJZGVwZW5kcyBvbiBEVkJfQjJDMl9GTEVYQ09QICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBBaXIvU2t5L0NhYmxlU3RhcjIgUENJIGNhcmQgKERWQi9BVFNDKSBieSBUZWNobmlzYXQvQjJDMi4KKworCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KKworY29uZmlnIERWQl9CMkMyX0ZMRVhDT1BfVVNCCisJdHJpc3RhdGUgIlRlY2huaXNhdC9CMkMyIEFpci9Ta3kvQ2FibGUyUEMgVVNCIgorCWRlcGVuZHMgb24gRFZCX0IyQzJfRkxFWENPUCAmJiBVU0IKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgQWlyL1NreS9DYWJsZTJQQyBVU0IxLjEgYm94IChEVkIvQVRTQykgYnkgVGVjaG5pc2F0L0IyQzIsCisKKwkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCisKK2NvbmZpZyBEVkJfQjJDMl9GTEVYQ09QX0RFQlVHCisJYm9vbCAiRW5hYmxlIGRlYnVnIGZvciB0aGUgQjJDMiBGbGV4Q29wIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBEVkJfQjJDMl9GTEVYQ09QCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBtb2R1bGUgb3B0aW9uIHRvIGNvbnRyb2wgZGVidWcgbWVzc2FnZXMKKwkgIG9mIGFsbCBCMkMyIEZsZXhDb3AgZHJpdmVycy4KKwogY29uZmlnIERWQl9CMkMyX1NLWVNUQVIKIAl0cmlzdGF0ZSAiQjJDMi9UZWNobmlzYXQgQWlyL1NreS9DYWJsZVN0YXIgMiBQQ0kiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kKQEAgLTExLDE2ICs0OCwzIEBACiAJICBmb3IgdGhlIEIyQzIvQkJUSSBBaXIyUEMtQVRTQyBjYXJkLgogCiAJICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBkZXZpY2UgYW5kIHdhbnQgdG8gdXNlIGl0LgotCi1jb25maWcgRFZCX0IyQzJfVVNCCi0JdHJpc3RhdGUgIkIyQzIvVGVjaG5pc2F0IEFpci9Ta3kvQ2FibGUyUEMgVVNCIgotCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBEVkJfU1RWMDI5OQotCXNlbGVjdCBEVkJfTVQzNTIKLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgQWlyL1NreS9DYWJsZTJQQyBVU0IgRFZCIGRldmljZSBieSBCMkMyLiBDdXJyZW50bHkKLQkgIHRoZSBkb2VzIG5vdGhpbmcsIGJ1dCBwcm92aWRpbmcgYmFzaWMgZnVuY3Rpb24gZm9yIHRoZSB1c2VkIHVzYiAKLQkgIHByb3RvY29sLgotCi0JICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBkZXZpY2UgYW5kIHdhbnQgdG8gdXNlIGl0LgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQppbmRleCA5ZmIxMjQ3Li43NzAzODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKQEAgLTEsNiArMSwxNCBAQAotb2JqLWIyYzItdXNiID0gYjJjMi11c2ItY29yZS5vIGIyYzItY29tbW9uLm8KK2IyYzItZmxleGNvcC1vYmpzID0gZmxleGNvcC5vIGZsZXhjb3AtZmUtdHVuZXIubyBmbGV4Y29wLWkyYy5vIFwKKwlmbGV4Y29wLXNyYW0ubyBmbGV4Y29wLWVlcHJvbS5vIGZsZXhjb3AtbWlzYy5vIGZsZXhjb3AtaHctZmlsdGVyLm8gXAorCWZsZXhjb3AtZG1hLm8KK29iai0kKENPTkZJR19EVkJfQjJDMl9GTEVYQ09QKSArPSBiMmMyLWZsZXhjb3AubworCitiMmMyLWZsZXhjb3AtcGNpLW9ianMgPSBmbGV4Y29wLXBjaS5vCitvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9QQ0kpICs9IGIyYzItZmxleGNvcC1wY2kubworCitiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCitvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCiBvYmotJChDT05GSUdfRFZCX0IyQzJfU0tZU1RBUikgKz0gc2t5c3RhcjIubwotb2JqLSQoQ09ORklHX0RWQl9CMkMyX1VTQikgKyA9IGIyYzItdXNiLm8KIAogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2IyYzItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2IyYzItY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMGQ2MGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9iMmMyLWNvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBiMmMyLWNvbW1vbi5jIC0gY29tbW9uIG1ldGhvZHMgZm9yIHRoZSBCMkMyL1RlY2huaXNhdCBTa3lTdGFyMiBQQ0kgRFZCIGNhcmQgYW5kCi0gKiAgICAgICAgICAgICAgICAgZm9yIHRoZSBCMkMyL1RlY2huaXNhdCBTa3kvQ2FibGUvQWlyU3RhciBVU0IgZGV2aWNlcwotICogICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBGbGV4Q29wSUkvRmxleENvcElJSSBieSBCMkMyLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzICBWYWRpbSBDYXRhbmEsIHNreXN0YXJAbW9sZG92YS5jYwotICoKLSAqIEZJWDogRElTRVFDIFRvbmUgQnVyc3QgaW4gZmxleGNvcF9kaXNlcWNfaW9jdGwoKQotICogRklYOiBGVUxMIHNvZnQgRGlTRXFDIGZvciBza3lzdGFyMiAoRmxleENvcElJIHJldiAxMzApIFZQMzEwIGVxdWlwcGVkCi0gKiAgICAgVmluY2Vuem8gRGkgTWFzc2EsIGhhd2suaXQgYXQgdGlzY2FsaW5ldC5pdAotICoKLSAqIENvbnZlcnRlZCB0byBMaW51eCBjb2Rpbmcgc3R5bGUKLSAqIE1pc2MgcmVvcmdhbml6YXRpb24sIHBvbGlzaGluZywgcmVzdHlsaW5nCi0gKiAgICAgUm9iZXJ0byBSYWd1c2EsIHIucmFndXNhIGF0IGxpYmVyby5pdAotICoKLSAqIEFkZGVkIGhhcmR3YXJlIGZpbHRlcmluZyBzdXBwb3J0LAotICogICAgIE5pa2xhcyBQZWluZWNrZSwgcGVpbmVja2UgYXQgZ2R2LnVuaS1oYW5ub3Zlci5kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8KLSNpbmNsdWRlICJzdHYwMjk5LmgiCi0jaW5jbHVkZSAibXQzNTIuaCIKLSNpbmNsdWRlICJtdDMxMi5oIgotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pCi17Ci0JdTggYWNsayA9IDA7Ci0JdTggYmNsayA9IDA7Ci0KLQlpZiAoc3JhdGUgPCAxNTAwMDAwKSB7IGFjbGsgPSAweGI3OyBiY2xrID0gMHg0NzsgfQotCWVsc2UgaWYgKHNyYXRlIDwgMzAwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NGI7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDcwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDRmOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCAxNDAwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NTM7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDMwMDAwMDAwKSB7IGFjbGsgPSAweGI2OyBiY2xrID0gMHg1MzsgfQotCWVsc2UgaWYgKHNyYXRlIDwgNDUwMDAwMDApIHsgYWNsayA9IDB4YjQ7IGJjbGsgPSAweDUxOyB9Ci0KLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgxMywgYWNsayk7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MTQsIGJjbGspOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDFmLCAocmF0aW8gPj4gMTYpICYgMHhmZik7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MjAsIChyYXRpbyA+PiAgOCkgJiAweGZmKTsKLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgyMSwgKHJhdGlvICAgICAgKSAmIDB4ZjApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Ftc3VuZ190Ym11MjQxMTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCi17Ci0JdTggYnVmWzRdOwotCXUzMiBkaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OwotLy8Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JZGl2ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMjU7Ci0KLQlidWZbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKLQlidWZbMV0gPSBkaXYgJiAweGZmOwotCWJ1ZlsyXSA9IDB4ODQ7ICAvLyAweEM0Ci0JYnVmWzNdID0gMHgwODsKLQotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDApIGJ1ZlszXSB8PSAweDEwOwotCi0vLwlpZiAoaTJjX3RyYW5zZmVyICgmYWRhcHRlci0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYltdID0gewotCSAgICAgMHgwMSwgMHgxNSwKLQkgICAgIDB4MDIsIDB4MzAsCi0JICAgICAweDAzLCAweDAwLAotCSAgICAgMHgwNCwgMHg3RCwKLQkgICAgIDB4MDUsIDB4MzUsCi0JICAgICAweDA2LCAweDAyLAotCSAgICAgMHgwNywgMHgwMCwKLQkgICAgIDB4MDgsIDB4QzMsCi0JICAgICAweDBDLCAweDAwLAotCSAgICAgMHgwRCwgMHg4MSwKLQkgICAgIDB4MEUsIDB4MjMsCi0JICAgICAweDBGLCAweDEyLAotCSAgICAgMHgxMCwgMHg3RSwKLQkgICAgIDB4MTEsIDB4ODQsCi0JICAgICAweDEyLCAweEI5LAotCSAgICAgMHgxMywgMHg4OCwKLQkgICAgIDB4MTQsIDB4ODksCi0JICAgICAweDE1LCAweEM5LAotCSAgICAgMHgxNiwgMHgwMCwKLQkgICAgIDB4MTcsIDB4NUMsCi0JICAgICAweDE4LCAweDAwLAotCSAgICAgMHgxOSwgMHgwMCwKLQkgICAgIDB4MUEsIDB4MDAsCi0JICAgICAweDFDLCAweDAwLAotCSAgICAgMHgxRCwgMHgwMCwKLQkgICAgIDB4MUUsIDB4MDAsCi0JICAgICAweDFGLCAweDNBLAotCSAgICAgMHgyMCwgMHgyRSwKLQkgICAgIDB4MjEsIDB4ODAsCi0JICAgICAweDIyLCAweEZGLAotCSAgICAgMHgyMywgMHhDMSwKLQkgICAgIDB4MjgsIDB4MDAsCi0JICAgICAweDI5LCAweDFFLAotCSAgICAgMHgyQSwgMHgxNCwKLQkgICAgIDB4MkIsIDB4MEYsCi0JICAgICAweDJDLCAweDA5LAotCSAgICAgMHgyRCwgMHgwNSwKLQkgICAgIDB4MzEsIDB4MUYsCi0JICAgICAweDMyLCAweDE5LAotCSAgICAgMHgzMywgMHhGRSwKLQkgICAgIDB4MzQsIDB4OTMsCi0JICAgICAweGZmLCAweGZmLAotfTsKLQotc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBzYW1zdW5nX3RibXUyNDExMl9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5pbml0dGFiID0gc2Ftc3VuZ190Ym11MjQxMTJfaW5pdHRhYiwKLQkubWNsayA9IDg4MDAwMDAwVUwsCi0JLmludmVydCA9IDAsCi0JLmVuaGFuY2VkX3R1bmluZyA9IDAsCi0JLnNraXBfcmVpbml0ID0gMCwKLQkubG9ja19vdXRwdXQgPSBTVFYwMjI5X0xPQ0tPVVRQVVRfTEssCi0JLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAotCS5taW5fZGVsYXlfbXMgPSAxMDAsCi0JLnNldF9zeW1ib2xfcmF0ZSA9IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZSwKLSAgIAkucGxsX3NldCA9IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQsCi19OwotCi0KLQotCi0KLXN0YXRpYyBpbnQgc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQotewotCXN0YXRpYyB1OCBtdDM1Ml9jbG9ja19jb25maWcgW10gPSB7IDB4ODksIDB4MTAsIDB4MmQgfTsKLQlzdGF0aWMgdTggbXQzNTJfcmVzZXQgW10gPSB7IDB4NTAsIDB4ODAgfTsKLQlzdGF0aWMgdTggbXQzNTJfYWRjX2N0bF8xX2NmZyBbXSA9IHsgMHg4RSwgMHg0MCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9hZ2NfY2ZnIFtdID0geyAweDY3LCAweDI4LCAweGExIH07Ci0Jc3RhdGljIHU4IG10MzUyX2NhcHRfcmFuZ2VfY2ZnW10gPSB7IDB4NzUsIDB4MzIgfTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9jbG9ja19jb25maWcsIHNpemVvZihtdDM1Ml9jbG9ja19jb25maWcpKTsKLQl1ZGVsYXkoMjAwMCk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX3Jlc2V0LCBzaXplb2YobXQzNTJfcmVzZXQpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWRjX2N0bF8xX2NmZywgc2l6ZW9mKG10MzUyX2FkY19jdGxfMV9jZmcpKTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfY2ZnLCBzaXplb2YobXQzNTJfYWdjX2NmZykpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9jYXB0X3JhbmdlX2NmZywgc2l6ZW9mKG10MzUyX2NhcHRfcmFuZ2VfY2ZnKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQotewotCXUzMiBkaXY7Ci0JdW5zaWduZWQgY2hhciBicyA9IDA7Ci0KLQkjZGVmaW5lIElGX0ZSRVFVRU5DWXg2IDIxNyAgICAvKiA2ICogMzYuMTY2NjY2NjY2NjdNSHogKi8KLQlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID49IDQ4MDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDE1NDAwMDAwMCkgYnMgPSAweDA5OwotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSAxNjEwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gNDM5MDAwMDAwKSBicyA9IDB4MGE7Ci0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID49IDQ0NzAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSA4NjMwMDAwMDApIGJzID0gMHgwODsKLQotCXBsbGJ1ZlswXSA9IDB4YzI7IC8vIE5vdGU6IG5vbi1saW51eCBzdGFuZGFyZCBQTEwgaTJjIGFkZHJlc3MKLQlwbGxidWZbMV0gPSBkaXYgPj4gODsKLSAgIAlwbGxidWZbMl0gPSBkaXYgJiAweGZmOwotICAgCXBsbGJ1ZlszXSA9IDB4Y2M7Ci0gICAJcGxsYnVmWzRdID0gYnM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7Ci0KLQkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCi0JLmRlbW9kX2luaXQgPSBzYW1zdW5nX3RkdGM5MjUxZGgwX2RlbW9kX2luaXQsCi0gICAJLnBsbF9zZXQgPSBzYW1zdW5nX3RkdGM5MjUxZGgwX3BsbF9zZXQsCi19OwotCi1zdGF0aWMgaW50IHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKLXsKLQl1OCBidWZbNF07Ci0JdTMyIGRpdjsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07Ci0vLwlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyAoMTI1LzIpKSAvIDEyNTsKLQotCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOwotCWJ1ZlsyXSA9IDB4ODQgfCAoKGRpdiA+PiAxMCkgJiAweDYwKTsKLQlidWZbM10gPSAweDgwOwotCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTU1MDAwMCkKLQkJYnVmWzNdIHw9IDB4MDI7Ci0KLQkvL2lmIChpMmNfdHJhbnNmZXIgKCZhZGFwdGVyLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQzMTJfY29uZmlnIHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcgPSB7Ci0KLQkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCi0gICAJLnBsbF9zZXQgPSBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2IyYzItdXNiLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvYjJjMi11c2ItY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzA2ZGEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvYjJjMi11c2ItY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+LAotICogICAgICAgICAgICAgICAgICAgIEx1Y2EgQmVydGFnbm9saW8gPD4sCi0gKgotICogYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgSm9obiBKdXJyaXVzIGZyb20gQkJUSSwgSW5jLgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlICJkbXhkZXYuaCIKLSNpbmNsdWRlICJkdmJfZGVtdXguaCIKLSNpbmNsdWRlICJkdmJfZmlsdGVyLmgiCi0jaW5jbHVkZSAiZHZiX25ldC5oIgotI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotCi0vKiBkZWJ1ZyAqLwotI2RlZmluZSBkcHJpbnRrKGxldmVsLGFyZ3MuLi4pIFwKLQkgICAgZG8geyBpZiAoKGRlYnVnICYgbGV2ZWwpKSB7IHByaW50ayhhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBkZWJ1Z19kdW1wKGIsbCkgaWYgKGRlYnVnKSB7XAotCWludCBpOyBkZWJfeGZlcigiJXM6ICVkID4gIixfX0ZVTkNUSU9OX18sbCk7IFwKLQlmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSBkZWJfeGZlcigiJTAyeCAiLCBiW2ldKTsgXAotCWRlYl94ZmVyKCJcbiIpO1wKLX0KLQotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8sdHM9MixjdHJsPTQgKG9yLWFibGUpKS4iKTsKLQotI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKDB4MDEsYXJncykKLSNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgZHByaW50aygweDAyLGFyZ3MpCi0jZGVmaW5lIGRlYl9jdHJsKGFyZ3MuLi4pIGRwcmludGsoMHgwNCxhcmdzKQotCi0vKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjAiCi0jZGVmaW5lIERSSVZFUl9ERVNDICJEcml2ZXIgZm9yIEIyQzIvVGVjaG5pc2F0IEFpci9DYWJsZS9Ta3ktMi1QQyBVU0IgZGV2aWNlcyIKLSNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiUGF0cmljayBCb2V0dGNoZXIsIHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUiCi0KLS8qIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgQjJDMl9VU0JfRlJBTUVTX1BFUl9JU08JCTQKLSNkZWZpbmUgQjJDMl9VU0JfTlVNX0lTT19VUkIJCTQgICAgLyogVE9ETyBjaGVjayBvdXQgYSBnb29kIHZhbHVlICovCi0KLSNkZWZpbmUgQjJDMl9VU0JfQ1RSTF9QSVBFX0lOCQl1c2JfcmN2Y3RybHBpcGUoYjJjMi0+dWRldiwwKQotI2RlZmluZSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUCQl1c2Jfc25kY3RybHBpcGUoYjJjMi0+dWRldiwwKQotI2RlZmluZSBCMkMyX1VTQl9EQVRBX1BJUEUJCQl1c2JfcmN2aXNvY3BpcGUoYjJjMi0+dWRldiwweDgxKQotCi1zdHJ1Y3QgdXNiX2IyYzJfdXNiIHsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGY7Ci0KLQl1OCAqaXNvX2J1ZmZlcjsKLQlpbnQgYnVmZmVyX3NpemU7Ci0JZG1hX2FkZHJfdCBpc29fZG1hX2hhbmRsZTsKLQlzdHJ1Y3QgdXJiICppc29fdXJiW0IyQzJfVVNCX05VTV9JU09fVVJCXTsKLX07Ci0KLQotLyoKLSAqIFVTQgotICogMTAgOTAgMzQgMTIgNzggNTYgMDQgMDAKLSAqIHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwwKSwKLSAqIDB4OTAsCi0gKiAweDEwLAotICogMHgxMjM0LAotICogMHg1Njc4LAotICogYnVmLAotICogNCwKLSAqIDUqSFopOwotICoKLSAqIGV4dGVybiBpbnQgdXNiX2NvbnRyb2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlLAotICogX191OCByZXF1ZXN0LAotICogX191OCByZXF1ZXN0dHlwZSwKLSAqIF9fdTE2IHZhbHVlLAotICogX191MTYgaW5kZXgsCi0gKiB2b2lkICpkYXRhLAotICogX191MTYgc2l6ZSwKLSAqIGludCB0aW1lb3V0KTsKLSAqCi0gKi8KLQotLyogcmVxdWVzdCB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIHsKLQotLyogc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhpcyBwYXJ0Ci0JUlRZUEVfUkVBRF9EVyAgICAgICAgID0gKDEgPDwgNiksCi0JUlRZUEVfV1JJVEVfRFdfMSAgICAgID0gKDMgPDwgNiksCi0JUlRZUEVfUkVBRF9WOF9NRU1PUlkgID0gKDYgPDwgNiksCi0JUlRZUEVfV1JJVEVfVjhfTUVNT1JZID0gKDcgPDwgNiksCi0JUlRZUEVfV1JJVEVfVjhfRkxBU0ggID0gKDggPDwgNiksCi0JUlRZUEVfR0VORVJJQyAgICAgICAgID0gKDkgPDwgNiksCi0qLwotCVJUWVBFX1JFQURfRFcgPSAoMyA8PCA2KSwKLQlSVFlQRV9XUklURV9EV18xID0gKDEgPDwgNiksCi0JCi0JUlRZUEVfUkVBRF9WOF9NRU1PUlkgID0gKDYgPDwgNiksCi0JUlRZUEVfV1JJVEVfVjhfTUVNT1JZID0gKDcgPDwgNiksCi0JUlRZUEVfV1JJVEVfVjhfRkxBU0ggID0gKDggPDwgNiksCi0JUlRZUEVfR0VORVJJQyAgICAgICAgID0gKDkgPDwgNiksCi19IGIyYzJfdXNiX3JlcXVlc3RfdHlwZV90OwotCi0vKiByZXF1ZXN0ICovCi10eXBlZGVmIGVudW0gewotCUIyQzJfVVNCX1dSSVRFX1Y4X01FTSA9IDB4MDQsCi0JQjJDMl9VU0JfUkVBRF9WOF9NRU0gID0gMHgwNSwKLQlCMkMyX1VTQl9SRUFEX1JFRyAgICAgPSAweDA4LAotCUIyQzJfVVNCX1dSSVRFX1JFRyAgICA9IDB4MEEsCi0vKglCMkMyX1VTQl9XUklURVJFR0xPICAgPSAweDBBLCAqLwotCUIyQzJfVVNCX1dSSVRFUkVHSEkgICA9IDB4MEIsCi0JQjJDMl9VU0JfRkxBU0hfQkxPQ0sgID0gMHgxMCwKLQlCMkMyX1VTQl9JMkNfUkVRVUVTVCAgPSAweDExLAotCUIyQzJfVVNCX1VUSUxJVFkgICAgICA9IDB4MTIsCi19IGIyYzJfdXNiX3JlcXVlc3RfdDsKLQotLyogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgSTJDX1JFUVVFU1QgKi8KLXR5cGVkZWYgZW51bSB7Ci0JVVNCX0ZVTkNfSTJDX1dSSVRFICAgICAgID0gMHgwMSwKLQlVU0JfRlVOQ19JMkNfTVVMVElXUklURSAgPSAweDAyLAotCVVTQl9GVU5DX0kyQ19SRUFEICAgICAgICA9IDB4MDMsCi0JVVNCX0ZVTkNfSTJDX1JFUEVBVFdSSVRFID0gMHgwNCwKLQlVU0JfRlVOQ19HRVRfREVTQ1JJUFRPUiAgPSAweDA1LAotCVVTQl9GVU5DX0kyQ19SRVBFQVRSRUFEICA9IDB4MDYsCi0vKiBES1QgMDIwMjA4IC0gYWRkIHRoaXMgdG8gc3VwcG9ydCBzcGVjaWFsIGNhc2Ugb2YgRGlTRXFDICovCi0JVVNCX0ZVTkNfSTJDX0NIRUNLV1JJVEUgID0gMHgwNywKLQlVU0JfRlVOQ19JMkNfQ0hFQ0tSRVNVTFQgPSAweDA4LAotfSBiMmMyX3VzYl9pMmNfZnVuY3Rpb25fdDsKLQotLyoKLSAqIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIFVUSUxJVFkgcmVxdWVzdCAweDEyCi0gKiBES1QgMDIwMzA0IC0gbmV3IHV0aWxpdHkgZnVuY3Rpb24KLSAqLwotdHlwZWRlZiBlbnVtIHsKLQlVVElMSVRZX1NFVF9GSUxURVIgICAgICAgICAgPSAweDAxLAotCVVUSUxJVFlfREFUQV9FTkFCTEUgICAgICAgICA9IDB4MDIsCi0JVVRJTElUWV9GTEVYX01VTFRJV1JJVEUgICAgID0gMHgwMywKLQlVVElMSVRZX1NFVF9CVUZGRVJfU0laRSAgICAgPSAweDA0LAotCVVUSUxJVFlfRkxFWF9PUEVSQVRPUiAgICAgICA9IDB4MDUsCi0JVVRJTElUWV9GTEVYX1JFU0VUMzAwX1NUQVJUID0gMHgwNiwKLQlVVElMSVRZX0ZMRVhfUkVTRVQzMDBfU1RPUCAgPSAweDA3LAotCVVUSUxJVFlfRkxFWF9SRVNFVDMwMCAgICAgICA9IDB4MDgsCi0JVVRJTElUWV9TRVRfSVNPX1NJWkUgICAgICAgID0gMHgwOSwKLQlVVElMSVRZX0RBVEFfUkVTRVQgICAgICAgICAgPSAweDBBLAotCVVUSUxJVFlfR0VUX0RBVEFfU1RBVFVTICAgICA9IDB4MTAsCi0JVVRJTElUWV9HRVRfVjhfUkVHICAgICAgICAgID0gMHgxMSwKLS8qIERLVCAwMjAzMjYgLSBhZGQgZnVuY3Rpb24gZm9yIHYxLjE0ICovCi0JVVRJTElUWV9TUkFNX1dSSVRFICAgICAgICAgID0gMHgxMiwKLQlVVElMSVRZX1NSQU1fUkVBRCAgICAgICAgICAgPSAweDEzLAotCVVUSUxJVFlfU1JBTV9URVNURklMTCAgICAgICA9IDB4MTQsCi0JVVRJTElUWV9TUkFNX1RFU1RTRVQgICAgICAgID0gMHgxNSwKLQlVVElMSVRZX1NSQU1fVEVTVFZFUklGWSAgICAgPSAweDE2LAotfSBiMmMyX3VzYl91dGlsaXR5X2Z1bmN0aW9uX3Q7Ci0KLSNkZWZpbmUgQjJDMl9XQUlUX0ZPUl9PUEVSQVRJT05fUlcgIDEgIC8vIDEgcwotI2RlZmluZSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9SRFcgMyAgLy8gMyBzCi0jZGVmaW5lIEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1dEVyAxICAvLyAxIHMKLQotI2RlZmluZSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9WOFJFQUQgICAzICAvLyAzIHMKLSNkZWZpbmUgQjJDMl9XQUlUX0ZPUl9PUEVSQVRJT05fVjhXUklURSAgMyAgLy8gMyBzCi0jZGVmaW5lIEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1Y4RkxBU0ggIDMgIC8vIDMgcwotCi0vKiBKTFAgMTExNzAwOiB3ZSB3aWxsIGluY2x1ZGUgdGhlIDEgYml0IGdhcCBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgMyBiaXRzCi0gKiBpbiB0aGUgSUJJIGFkZHJlc3MsIHRvIG1ha2UgdGhlIFY4IGNvZGUgc2ltcGxlci4KLSAqIFBDSSBBRERSRVNTIEZPUk1BVDogMHg3MUMgLT4gMDAwMCAwMTExIDAwMDEgMTEwMCAodGhlc2UgYXJlIHRoZSBzaXggYml0cyB1c2VkKQotICogICAgICAgICAgICAgICAgICBpbiBnZW5lcmFsOiAwMDAwIDBISEggMDAwTCBMTDAwCi0gKiBJQkkgQUREUkVTUyBGT1JNQVQ6ICAgICAgICAgICAgICAgICAgICBSSEhIIEJMTEwKLSAqCi0gKiB3aGVyZSBSIGlzIHRoZSByZWFkKDEpL3dyaXRlKDApIGJpdCwgQiBpcyB0aGUgYnVzeSBiaXQKLSAqIGFuZCBISEggYW5kIExMTCBhcmUgdGhlIHR3byBzZXRzIG9mIHRocmVlIGJpdHMgZnJvbSB0aGUgUENJIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgQjJDMl9GTEVYX1BDSU9GRlNFVF9UT19JTlRFUk5BTEFERFIodXNQQ0kpICh1OCkgKCgodXNQQ0kgPj4gMikgJiAweDA3KSArICgodXNQQ0kgPj4gNCkgJiAweDcwKSkKLSNkZWZpbmUgQjJDMl9GTEVYX0lOVEVSTkFMQUREUl9UT19QQ0lPRkZTRVQodWNBZGRyKSAodTE2KSAoKCh1Y0FkZHIgJiAweDA3KSA8PCAyKSArICgodWNBZGRyICYgMHg3MCkgPDwgNCkpCi0KLS8qCi0gKiBES1QgMDIwMjI4IC0gZm9yZ2V0IGFib3V0IHRoaXMgVkVORE9SX0JVRkZFUl9TSVpFLCByZWFkIGFuZCB3cml0ZSByZWdpc3RlcgotICogZGVhbCB3aXRoIERXT1JEIG9yIDQgYnl0ZXMsIHRoYXQgc2hvdWxkIGJlIHNob3VsZCBmcm9tIG5vdyBvbgotICovCi1zdGF0aWMgdTMyIGIyYzJfdXNiX3JlYWRfZHcoc3RydWN0IHVzYl9iMmMyX3VzYiAqYjJjMiwgdTE2IHdSZWdPZmZzUENJKQotewotCXUzMiB2YWw7Ci0JdTE2IHdBZGRyZXNzID0gQjJDMl9GTEVYX1BDSU9GRlNFVF9UT19JTlRFUk5BTEFERFIod1JlZ09mZnNQQ0kpIHwgMHgwMDgwOwotCWludCBsZW4gPSB1c2JfY29udHJvbF9tc2coYjJjMi0+dWRldiwKLQkJCUIyQzJfVVNCX0NUUkxfUElQRV9JTiwKLQkJCUIyQzJfVVNCX1JFQURfUkVHLAotCQkJUlRZUEVfUkVBRF9EVywKLQkJCXdBZGRyZXNzLAotCQkJMCwKLQkJCSZ2YWwsCi0JCQlzaXplb2YodTMyKSwKLQkJCUIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1JEVyAqIDEwMDApOwotCi0JaWYgKGxlbiAhPSBzaXplb2YodTMyKSkgewotCQllcnIoImVycm9yIHdoaWxlIHJlYWRpbmcgZHdvcmQgZnJvbSAlZCAoJWQpLiIsd0FkZHJlc3Msd1JlZ09mZnNQQ0kpOwotCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UKLQkJcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIERLVCAwMjAyMjggLSBmcm9tIG5vdyBvbiwgd2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvbGRlciB0aGFuIGZpcm0gMS4wMAotICogSSBlbGltaW5hdGVkIHRoZSB3cml0ZSByZWdpc3RlciBhcyBhIDIgdHJpcCBvZiB3cml0aW5nIGhpIHdvcmQgYW5kIGxvIHdvcmQKLSAqIGFuZCBmb3JjZSB0aGlzIHRvIHdyaXRlIG9ubHkgNCBieXRlcyBhdCBhIHRpbWUuCi0gKiBOT1RFOiB0aGlzIHNob3VsZCB3b3JrIHdpdGggYWxsIHRoZSBmaXJtd2FyZSBmcm9tIDEuMDAgYW5kIG5ld2VyCi0gKi8KLXN0YXRpYyBpbnQgYjJjMl91c2Jfd3JpdGVfZHcoc3RydWN0IHVzYl9iMmMyX3VzYiAqYjJjMiwgdTE2IHdSZWdPZmZzUENJLCB1MzIgdmFsKQotewotCXUxNiB3QWRkcmVzcyA9IEIyQzJfRkxFWF9QQ0lPRkZTRVRfVE9fSU5URVJOQUxBRERSKHdSZWdPZmZzUENJKTsKLQlpbnQgbGVuID0gdXNiX2NvbnRyb2xfbXNnKGIyYzItPnVkZXYsCi0JCQlCMkMyX1VTQl9DVFJMX1BJUEVfT1VULAotCQkJQjJDMl9VU0JfV1JJVEVfUkVHLAotCQkJUlRZUEVfV1JJVEVfRFdfMSwKLQkJCXdBZGRyZXNzLAotCQkJMCwKLQkJCSZ2YWwsCi0JCQlzaXplb2YodTMyKSwKLQkJCUIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1JEVyAqIDEwMDApOwotCi0JaWYgKGxlbiAhPSBzaXplb2YodTMyKSkgewotCQllcnIoImVycm9yIHdoaWxlIHJlYWRpbmcgZHdvcmQgZnJvbSAlZCAoJWQpLiIsd0FkZHJlc3Msd1JlZ09mZnNQQ0kpOwotCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBES1QgMDEwODE3IC0gYWRkIHN1cHBvcnQgZm9yIFY4IG1lbW9yeSByZWFkL3dyaXRlIGFuZCBmbGFzaCB1cGRhdGUKLSAqLwotc3RhdGljIGludCBiMmMyX3VzYl92OF9tZW1vcnlfcmVxKHN0cnVjdCB1c2JfYjJjMl91c2IgKmIyYzIsCi0JCWIyYzJfdXNiX3JlcXVlc3RfdCByZXEsIHU4IHBhZ2UsIHUxNiB3QWRkcmVzcywKLQkJdTE2IGJ1ZmxlbiwgdTggKnBiQnVmZmVyKQotewotCXU4IGR3UmVxdWVzdFR5cGU7Ci0JdTE2IHdJbmRleDsKLQlpbnQgbldhaXRUaW1lLHBpcGUsbGVuOwotCi0Jd0luZGV4ID0gcGFnZSA8PCA4OwotCi0Jc3dpdGNoIChyZXEpIHsKLQkJY2FzZSBCMkMyX1VTQl9SRUFEX1Y4X01FTToKLQkJCW5XYWl0VGltZSA9IEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1Y4UkVBRDsKLQkJCWR3UmVxdWVzdFR5cGUgPSAodTgpIFJUWVBFX1JFQURfVjhfTUVNT1JZOwotCQkJcGlwZSA9IEIyQzJfVVNCX0NUUkxfUElQRV9JTjsKLQkJYnJlYWs7Ci0JCWNhc2UgQjJDMl9VU0JfV1JJVEVfVjhfTUVNOgotCQkJd0luZGV4IHw9IHBiQnVmZmVyWzBdOwotCQkJbldhaXRUaW1lID0gQjJDMl9XQUlUX0ZPUl9PUEVSQVRJT05fVjhXUklURTsKLQkJCWR3UmVxdWVzdFR5cGUgPSAodTgpIFJUWVBFX1dSSVRFX1Y4X01FTU9SWTsKLQkJCXBpcGUgPSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUOwotCQlicmVhazsKLQkJY2FzZSBCMkMyX1VTQl9GTEFTSF9CTE9DSzoKLQkJCW5XYWl0VGltZSA9IEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1Y4RkxBU0g7Ci0JCQlkd1JlcXVlc3RUeXBlID0gKHU4KSBSVFlQRV9XUklURV9WOF9GTEFTSDsKLQkJCXBpcGUgPSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUOwotCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRlYl9pbmZvKCJ1bnN1cHBvcnRlZCByZXF1ZXN0IGZvciB2OF9tZW1fcmVxICV4LlxuIixyZXEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbGVuID0gdXNiX2NvbnRyb2xfbXNnKGIyYzItPnVkZXYscGlwZSwKLQkJCXJlcSwKLQkJCWR3UmVxdWVzdFR5cGUsCi0JCQl3QWRkcmVzcywKLQkJCXdJbmRleCwKLQkJCXBiQnVmZmVyLAotCQkJYnVmbGVuLAotCQkJbldhaXRUaW1lICogMTAwMCk7Ci0JcmV0dXJuIGxlbiA9PSBidWZsZW4gPyAwIDogLUVJTzsKLX0KLQotc3RhdGljIGludCBiMmMyX3VzYl9pMmNfcmVxKHN0cnVjdCB1c2JfYjJjMl91c2IgKmIyYzIsCi0JCWIyYzJfdXNiX3JlcXVlc3RfdCByZXEsIGIyYzJfdXNiX2kyY19mdW5jdGlvbl90IGZ1bmMsCi0JCXU4IHBvcnQsIHU4IGNoaXBhZGRyLCB1OCBhZGRyLCB1OCBidWZsZW4sIHU4ICpidWYpCi17Ci0JdTE2IHdWYWx1ZSwgd0luZGV4OwotCWludCBuV2FpdFRpbWUscGlwZSxsZW47Ci0JdTggZHdSZXF1ZXN0VHlwZTsKLQotCXN3aXRjaCAoZnVuYykgewotCQljYXNlIFVTQl9GVU5DX0kyQ19XUklURToKLQkJY2FzZSBVU0JfRlVOQ19JMkNfTVVMVElXUklURToKLQkJY2FzZSBVU0JfRlVOQ19JMkNfUkVQRUFUV1JJVEU6Ci0JCS8qIERLVCAwMjAyMDggLSBhZGQgdGhpcyB0byBzdXBwb3J0IHNwZWNpYWwgY2FzZSBvZiBEaVNFcUMgKi8KLQkJY2FzZSBVU0JfRlVOQ19JMkNfQ0hFQ0tXUklURToKLQkJCXBpcGUgPSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUOwotCQkJbldhaXRUaW1lID0gMjsKLQkJCWR3UmVxdWVzdFR5cGUgPSAodTgpIFJUWVBFX0dFTkVSSUM7Ci0JCWJyZWFrOwotCQljYXNlIFVTQl9GVU5DX0kyQ19SRUFEOgotCQljYXNlIFVTQl9GVU5DX0kyQ19SRVBFQVRSRUFEOgotCQkJcGlwZSA9IEIyQzJfVVNCX0NUUkxfUElQRV9JTjsKLQkJCW5XYWl0VGltZSA9IDI7Ci0JCQlkd1JlcXVlc3RUeXBlID0gKHU4KSBSVFlQRV9HRU5FUklDOwotCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRlYl9pbmZvKCJ1bnN1cHBvcnRlZCBmdW5jdGlvbiBmb3IgaTJjX3JlcSAleFxuIixmdW5jKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQl3VmFsdWUgPSAoZnVuYyA8PCA4ICkgfCBwb3J0OwotCXdJbmRleCA9IChjaGlwYWRkciA8PCA4ICkgfCBhZGRyOwotCi0JbGVuID0gdXNiX2NvbnRyb2xfbXNnKGIyYzItPnVkZXYscGlwZSwKLQkJCXJlcSwKLQkJCWR3UmVxdWVzdFR5cGUsCi0JCQlhZGRyLAotCQkJd0luZGV4LAotCQkJYnVmLAotCQkJYnVmbGVuLAotCQkJbldhaXRUaW1lICogMTAwMCk7Ci0JcmV0dXJuIGxlbiA9PSBidWZsZW4gPyAwIDogLUVJTzsKLX0KLQotaW50IHN0YXRpYyBiMmMyX3VzYl91dGlsaXR5X3JlcShzdHJ1Y3QgdXNiX2IyYzJfdXNiICpiMmMyLCBpbnQgc2V0LAotCQliMmMyX3VzYl91dGlsaXR5X2Z1bmN0aW9uX3QgZnVuYywgdTggZXh0cmEsIHUxNiB3SW5kZXgsCi0JCXUxNiBidWZsZW4sIHU4ICpwdkJ1ZmZlcikKLXsKLQl1MTYgd1ZhbHVlOwotCWludCBuV2FpdFRpbWUgPSAyLAotCQlwaXBlID0gc2V0ID8gQjJDMl9VU0JfQ1RSTF9QSVBFX09VVCA6IEIyQzJfVVNCX0NUUkxfUElQRV9JTiwKLQkJbGVuOwotCi0Jd1ZhbHVlID0gKGZ1bmMgPDwgOCkgfCBleHRyYTsKLQotCWxlbiA9IHVzYl9jb250cm9sX21zZyhiMmMyLT51ZGV2LHBpcGUsCi0JCQlCMkMyX1VTQl9VVElMSVRZLAotCQkJKHU4KSBSVFlQRV9HRU5FUklDLAotCQkJd1ZhbHVlLAotCQkJd0luZGV4LAotCQkJcHZCdWZmZXIsCi0JCQlidWZsZW4sCi0JCQluV2FpdFRpbWUgKiAxMDAwKTsKLQlyZXR1cm4gbGVuID09IGJ1ZmxlbiA/IDAgOiAtRUlPOwotfQotCi0KLQotc3RhdGljIHZvaWQgYjJjMl9kdW1wZm91cnJlZyhzdHJ1Y3QgdXNiX2IyYzJfdXNiICpiMmMyLCB1MTYgb2ZmcykKLXsKLQl1MzIgcjAscjEscjIscjM7Ci0JcjAgPSByMSA9IHIyID0gcjMgPSAwOwotCXIwID0gYjJjMl91c2JfcmVhZF9kdyhiMmMyLG9mZnMpOwotCXIxID0gYjJjMl91c2JfcmVhZF9kdyhiMmMyLG9mZnMgKyAweDA0KTsKLQlyMiA9IGIyYzJfdXNiX3JlYWRfZHcoYjJjMixvZmZzICsgMHgwOCk7Ci0JcjMgPSBiMmMyX3VzYl9yZWFkX2R3KGIyYzIsb2ZmcyArIDB4MGMpOwotCWRlYl9jdHJsKCJkdW1wOiBvZmZzZXQ6ICUwM3gsICUwOHgsICUwOHgsICUwOHgsICUwOHhcbiIsb2ZmcyxyMCxyMSxyMixyMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGIyYzJfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKLXsKLQlzdHJ1Y3QgdXNiX2IyYzJfdXNiICpiMmMyID0gdXJiLT5jb250ZXh0OwotCWRlYl90cygidXJiIGNvbXBsZXRlZCwgYnVmc2l6ZTogJWRcbiIsdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQotLy8JdXJiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOyBlbmFibGUgZm9yIHJlYWwgYWN0aW9uCi19Ci0KLXN0YXRpYyB2b2lkIGIyYzJfZXhpdF91c2Ioc3RydWN0IHVzYl9iMmMyX3VzYiAqYjJjMikKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQjJDMl9VU0JfTlVNX0lTT19VUkI7IGkrKykKLQkJaWYgKGIyYzItPmlzb191cmJbaV0gIT0gTlVMTCkgeyAvKiBub3Qgc3VyZSBhYm91dCB1bmxpbmtfdXJiIGFuZCBpc28tdXJicyBUT0RPICovCi0JCQlkZWJfaW5mbygidW5saW5raW5nL2tpbGxpbmcgdXJiIG5vLiAlZFxuIixpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDcpCi0JCQl1c2JfdW5saW5rX3VyYihiMmMyLT5pc29fdXJiW2ldKTsKLSNlbHNlCi0JCQl1c2Jfa2lsbF91cmIoYjJjMi0+aXNvX3VyYltpXSk7Ci0jZW5kaWYKLQkJCXVzYl9mcmVlX3VyYihiMmMyLT5pc29fdXJiW2ldKTsKLQkJfQotCi0JaWYgKGIyYzItPmlzb19idWZmZXIgIT0gTlVMTCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChOVUxMLGIyYzItPmJ1ZmZlcl9zaXplLCBiMmMyLT5pc29fYnVmZmVyLCBiMmMyLT5pc29fZG1hX2hhbmRsZSk7Ci0KLX0KLQotc3RhdGljIGludCBiMmMyX2luaXRfdXNiKHN0cnVjdCB1c2JfYjJjMl91c2IgKmIyYzIpCi17Ci0JdTE2IGZyYW1lX3NpemUgPSBsZTE2X3RvX2NwdShiMmMyLT51aW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzBdLmRlc2Mud01heFBhY2tldFNpemUpOwotCWludCBidWZzaXplID0gQjJDMl9VU0JfTlVNX0lTT19VUkIgKiBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTyAqIGZyYW1lX3NpemUsaSxqLHJldDsKLQlpbnQgYnVmZmVyX29mZnNldCA9IDA7Ci0KLQlkZWJfaW5mbygiY3JlYXRpbmcgJWQgaXNvLXVyYnMgd2l0aCAlZCBmcmFtZXMgZWFjaCBvZiAlZCBieXRlcyBzaXplID0gJWQuXG4iLAotCQkJQjJDMl9VU0JfTlVNX0lTT19VUkIsIEIyQzJfVVNCX0ZSQU1FU19QRVJfSVNPLCBmcmFtZV9zaXplLGJ1ZnNpemUpOwotCi0JYjJjMi0+aXNvX2J1ZmZlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KE5VTEwsYnVmc2l6ZSwmYjJjMi0+aXNvX2RtYV9oYW5kbGUpOwotCWlmIChiMmMyLT5pc29fYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChiMmMyLT5pc29fYnVmZmVyLCAwLCBidWZzaXplKTsKLQliMmMyLT5idWZmZXJfc2l6ZSA9IGJ1ZnNpemU7Ci0KLQkvKiBjcmVhdGluZyBpc28gdXJicyAqLwotCWZvciAoaSA9IDA7IGkgPCBCMkMyX1VTQl9OVU1fSVNPX1VSQjsgaSsrKQotCQlpZiAoIShiMmMyLT5pc29fdXJiW2ldID0gdXNiX2FsbG9jX3VyYihCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTyxHRlBfQVRPTUlDKSkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIHVyYl9lcnJvcjsKLQkJfQotCS8qIGluaXRpYWxpc2luZyBhbmQgc3VibWl0dGluZyBpc28gdXJicyAqLwotCWZvciAoaSA9IDA7IGkgPCBCMkMyX1VTQl9OVU1fSVNPX1VSQjsgaSsrKSB7Ci0JCWludCBmcmFtZV9vZmZzZXQgPSAwOwotCQlzdHJ1Y3QgdXJiICp1cmIgPSBiMmMyLT5pc29fdXJiW2ldOwotCQlkZWJfaW5mbygiaW5pdGlhbGl6aW5nIGFuZCBzdWJtaXR0aW5nIHVyYiBuby4gJWQgKGJ1Zl9vZmZzZXQ6ICVkKS5cbiIsaSxidWZmZXJfb2Zmc2V0KTsKLQotCQl1cmItPmRldiA9IGIyYzItPnVkZXY7Ci0JCXVyYi0+Y29udGV4dCA9IGIyYzI7Ci0JCXVyYi0+Y29tcGxldGUgPSBiMmMyX3VyYl9jb21wbGV0ZTsKLQkJdXJiLT5waXBlID0gQjJDMl9VU0JfREFUQV9QSVBFOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwotCQl1cmItPmludGVydmFsID0gMTsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEIyQzJfVVNCX0ZSQU1FU19QRVJfSVNPOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBmcmFtZV9zaXplICogQjJDMl9VU0JfRlJBTUVTX1BFUl9JU087Ci0JCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gYjJjMi0+aXNvX2J1ZmZlciArIGJ1ZmZlcl9vZmZzZXQ7Ci0KLQkJYnVmZmVyX29mZnNldCArPSBmcmFtZV9zaXplICogQjJDMl9VU0JfRlJBTUVTX1BFUl9JU087Ci0JCWZvciAoaiA9IDA7IGogPCBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTzsgaisrKSB7Ci0JCQlkZWJfaW5mbygidXJiIG5vOiAlZCwgZnJhbWU6ICVkLCBmcmFtZV9vZmZzZXQ6ICVkXG4iLGksaixmcmFtZV9vZmZzZXQpOwotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBmcmFtZV9vZmZzZXQ7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IGZyYW1lX3NpemU7Ci0JCQlmcmFtZV9vZmZzZXQgKz0gZnJhbWVfc2l6ZTsKLQkJfQotCi0JCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIoYjJjMi0+aXNvX3VyYltpXSxHRlBfQVRPTUlDKSkpIHsKLQkJCWVycigic3VibWl0dGluZyB1cmIgJWQgZmFpbGVkIHdpdGggJWQuIixpLHJldCk7Ci0JCQlnb3RvIHVyYl9lcnJvcjsKLQkJfQotCQlkZWJfaW5mbygic3VibWl0dGVkIHVyYiBuby4gJWQuXG4iLGkpOwotCX0KLQotCXJldCA9IDA7Ci0JZ290byBzdWNjZXNzOwotdXJiX2Vycm9yOgotCWIyYzJfZXhpdF91c2IoYjJjMik7Ci1zdWNjZXNzOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYjJjMl91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0Jc3RydWN0IHVzYl9iMmMyX3VzYiAqYjJjMiA9IE5VTEw7Ci0JaW50IHJldDsKLQotCWIyYzIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2IyYzJfdXNiKSxHRlBfS0VSTkVMKTsKLQlpZiAoYjJjMiA9PSBOVUxMKSB7Ci0JCWVycigibm8gbWVtb3J5Iik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQliMmMyLT51ZGV2ID0gdWRldjsKLQliMmMyLT51aW50ZiA9IGludGY7Ci0KLQkvKiB1c2UgdGhlIGFsdGVybmF0ZSBzZXR0aW5nIHdpdGggdGhlIGxhcmdlcyBidWZmZXIgKi8KLQl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LDAsMSk7Ci0KLQlpZiAoKHJldCA9IGIyYzJfaW5pdF91c2IoYjJjMikpKQotCQlnb3RvIHVzYl9pbml0X2Vycm9yOwotCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLGIyYzIpOwotCi0Jc3dpdGNoICh1ZGV2LT5zcGVlZCkgewotCQljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCQllcnIoImNhbm5vdCBoYW5kbGUgVVNCIHNwZWVkIGJlY2F1c2UgaXQgaXMgdG8gc0xPVy4iKTsKLQkJCWJyZWFrOwotCQljYXNlIFVTQl9TUEVFRF9GVUxMOgotCQkJaW5mbygicnVubmluZyBhdCBGVUxMIHNwZWVkLiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1NQRUVEX0hJR0g6Ci0JCQlpbmZvKCJydW5uaW5nIGF0IEhJR0ggc3BlZWQuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfU1BFRURfVU5LTk9XTjogLyogZmFsbCB0aHJvdWdoICovCi0JCWRlZmF1bHQ6Ci0JCQllcnIoImNhbm5vdCBoYW5kbGUgVVNCIHNwZWVkIGJlY2F1c2UgaXQgaXMgdW5rb3duLiIpOwotCQlicmVhazsKLQl9Ci0KLQliMmMyX2R1bXBmb3VycmVnKGIyYzIsMHgyMDApOwotCWIyYzJfZHVtcGZvdXJyZWcoYjJjMiwweDMwMCk7Ci0JYjJjMl9kdW1wZm91cnJlZyhiMmMyLDB4NDAwKTsKLQliMmMyX2R1bXBmb3VycmVnKGIyYzIsMHg3MDApOwotCi0KLQlpZiAocmV0ID09IDApCi0JCWluZm8oIiVzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgY29ubmVjdGVkLiIsRFJJVkVSX0RFU0MpOwotCWVsc2UKLQkJaW5mbygiJXMgZXJyb3Igd2hpbGUgbG9hZGluZyBkcml2ZXIgKCVkKSIsRFJJVkVSX0RFU0MscmV0KTsKLQotCXJldCA9IDA7Ci0JZ290byBzdWNjZXNzOwotCi11c2JfaW5pdF9lcnJvcjoKLQlrZnJlZShiMmMyKTsKLXN1Y2Nlc3M6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYjJjMl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2IyYzJfdXNiICpiMmMyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsTlVMTCk7Ci0JaWYgKGIyYzIgIT0gTlVMTCkgewotCQliMmMyX2V4aXRfdXNiKGIyYzIpOwotCQlrZnJlZShiMmMyKTsKLQl9Ci0JaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGRlaW5pdGlhbGl6ZWQgYW5kIGRpc2Nvbm5lY3RlZC4iLERSSVZFUl9ERVNDKTsKLQotfQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYjJjMl91c2JfdGFibGUgW10gPSB7Ci0JICAgIHsgVVNCX0RFVklDRSgweDBhZjcsIDB4MDEwMSkgfQotfTsKLQotLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLwotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGIyYzJfdXNiX2RyaXZlciA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gImR2Yl9iMmMyX3VzYiIsCi0JLnByb2JlIAkJPSBiMmMyX3VzYl9wcm9iZSwKLQkuZGlzY29ubmVjdCA9IGIyYzJfdXNiX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlIAk9IGIyYzJfdXNiX3RhYmxlLAotfTsKLQotLyogbW9kdWxlIHN0dWZmICovCi1zdGF0aWMgaW50IF9faW5pdCBiMmMyX3VzYl9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmYjJjMl91c2JfZHJpdmVyKSkpIHsKLQkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiMmMyX3VzYl9leGl0KHZvaWQpCi17Ci0JLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JdXNiX2RlcmVnaXN0ZXIoJmIyYzJfdXNiX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0IChiMmMyX3VzYl9pbml0KTsKLW1vZHVsZV9leGl0IChiMmMyX3VzYl9leGl0KTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYjJjMl91c2JfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2QxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtY29tbW9uLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtY29tbW9uLmggLSBjb21tb24gaGVhZGVyIGZpbGUgZm9yIGRldmljZS1zcGVjaWZpYyBzb3VyY2UgZmlsZXMgYWxzby4KKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKyNpZm5kZWYgX19GTEVYQ09QX0NPTU1PTl9IX18KKyNkZWZpbmUgX19GTEVYQ09QX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAiZmxleGNvcC1yZWcuaCIKKworI2luY2x1ZGUgImRteGRldi5oIgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9maWx0ZXIuaCIKKyNpbmNsdWRlICJkdmJfbmV0LmgiCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNkZWZpbmUgRkNfTUFYX0ZFRUQgMjU2CisKKyNpZm5kZWYgRkNfTE9HX1BSRUZJWAorI3dhcm5pbmcgcGxlYXNlIGRlZmluZSBhIGxvZyBwcmVmaXggZm9yIHlvdXIgZmlsZSwgdXNpbmcgYSBkZWZhdWx0IG9uZQorI2RlZmluZSBGQ19MT0dfUFJFRklYICJiMmMyLXVuZGVmIgorI2VuZGlmCisKKy8qIFN0ZWFsIGZyb20gdXNiLmggKi8KKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGZvcm1hdCwgIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSICAgICBGQ19MT0dfUFJFRklYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjdW5kZWYgaW5mbworI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICAgIEZDX0xPR19QUkVGSVggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyN1bmRlZiB3YXJuCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgRkNfTE9HX1BSRUZJWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCitzdHJ1Y3QgZmxleGNvcF9kbWEgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJdTggKmNwdV9hZGRyMDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyMDsKKwl1OCAqY3B1X2FkZHIxOworCWRtYV9hZGRyX3QgZG1hX2FkZHIxOworCXUzMiBzaXplOyAvKiBzaXplIG9mIGVhY2ggYWRkcmVzcyBpbiBieXRlcyAqLworfTsKKworLyogQ29udHJvbCBzdHJ1Y3R1cmUgZm9yIGRhdGEgZGVmaW5pdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCisgKiB0aGUgQjJDMi1iYXNlZCBQQ0kgYW5kIFVTQiBkZXZpY2VzLgorICovCitzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgeworCS8qIGdlbmVyYWwgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7IC8qIGZvciBmaXJtd2FyZV9jbGFzcyAqLworCisjZGVmaW5lIEZDX1NUQVRFX0RWQl9JTklUIDB4MDEKKyNkZWZpbmUgRkNfU1RBVEVfSTJDX0lOSVQgMHgwMgorI2RlZmluZSBGQ19TVEFURV9GRV9JTklUICAweDA0CisJaW50IGluaXRfc3RhdGU7CisKKwkvKiBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKwlpbnQgaGFzXzMyX2h3X3BpZF9maWx0ZXI7CisJZmxleGNvcF9yZXZpc2lvbl90IHJldjsKKwlmbGV4Y29wX2RldmljZV90eXBlX3QgZGV2X3R5cGU7CisJZmxleGNvcF9idXNfdCBidXNfdHlwZTsKKworCS8qIGR2YiBzdHVmZiAqLworCXN0cnVjdCBkdmJfYWRhcHRlciBkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlzdHJ1Y3QgZHZiX25ldCBkdmJuZXQ7CisJc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKKwlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKKwlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOworCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOworCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKKworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGkyY19zZW07CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCS8qIG9wdGlvbnMgYW5kIHN0YXR1cyAqLworCWludCBleHRyYV9mZWVkY291bnQ7CisJaW50IGZlZWRjb3VudDsKKwlpbnQgcGlkX2ZpbHRlcmluZzsKKwlpbnQgZnVsbHRzX3N0cmVhbWluZ19zdGF0ZTsKKworCS8qIGJ1cyBzcGVjaWZpYyBjYWxsYmFja3MgKi8KKwlmbGV4Y29wX2liaV92YWx1ZSAoKnJlYWRfaWJpX3JlZykgIChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKiwgZmxleGNvcF9pYmlfcmVnaXN0ZXIpOworCWludCAgICAgICAgICAgICAgICgqd3JpdGVfaWJpX3JlZykgKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqLCBmbGV4Y29wX2liaV9yZWdpc3RlciwgZmxleGNvcF9pYmlfdmFsdWUpOworCisKKwlpbnQgKCppMmNfcmVxdWVzdCkgKHN0cnVjdCBmbGV4Y29wX2RldmljZSosIGZsZXhjb3BfYWNjZXNzX29wX3QsIGZsZXhjb3BfaTJjX3BvcnRfdCwgdTggY2hpcGFkZHIsIHU4IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pOworCWludCAoKnN0cmVhbV9jb250cm9sKSAoc3RydWN0IGZsZXhjb3BfZGV2aWNlKiwgaW50KTsKKworCWludCAoKmdldF9tYWNfYWRkcikgKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBleHRlbmRlZCk7CisKKwl2b2lkICpidXNfc3BlY2lmaWM7Cit9OworCisvKiBleHBvcnRlZCBwcm90b3R5cGVzICovCisKKy8qIGZyb20gZmxleGNvcC5jICovCit2b2lkIGZsZXhjb3BfcGFzc19kbXhfZGF0YShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1OCAqYnVmLCB1MzIgbGVuKTsKK3ZvaWQgZmxleGNvcF9wYXNzX2RteF9wYWNrZXRzKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHU4ICpidWYsIHUzMiBubyk7CisKK3N0cnVjdCBmbGV4Y29wX2RldmljZSAqZmxleGNvcF9kZXZpY2Vfa21hbGxvYyhzaXplX3QgYnVzX3NwZWNpZmljX2xlbik7Cit2b2lkIGZsZXhjb3BfZGV2aWNlX2tmcmVlKHN0cnVjdCBmbGV4Y29wX2RldmljZSopOworCitpbnQgIGZsZXhjb3BfZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IGZsZXhjb3BfZGV2aWNlKik7Cit2b2lkIGZsZXhjb3BfZGV2aWNlX2V4aXQoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyk7CisKKy8qIGZyb20gZmxleGNvcC1kbWEuYyAqLworaW50IGZsZXhjb3BfZG1hX2FsbG9jYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgZmxleGNvcF9kbWEgKmRtYSwgdTMyIHNpemUpOwordm9pZCBmbGV4Y29wX2RtYV9mcmVlKHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hKTsKKworaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7CitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IG5vLCBpbnQgb25vZmYpOworaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IG5vLCBpbnQgb25vZmYpOworaW50IGZsZXhjb3BfZG1hX2NvbmZpZyhzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBzdHJ1Y3QgZmxleGNvcF9kbWEgKmRtYSwgZmxleGNvcF9kbWFfaW5kZXhfdCBkbWFfaWR4LGZsZXhjb3BfZG1hX2FkZHJfaW5kZXhfdCBpbmRleCk7CitpbnQgZmxleGNvcF9kbWFfY29uZmlnX3RpbWVyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgdTggY3ljbGVzKTsKK2ludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgdTggcGFja2V0cyk7CisKKy8qIGZyb20gZmxleGNvcC1lZXByb20uYyAqLworLyogdGhlIFBDSSBwYXJ0IHVzZXMgdGhpcyBjYWxsIHRvIGdldCB0aGUgTUFDIGFkZHJlc3MsIHRoZSBVU0IgcGFydCBoYXMgaXRzIG93biAqLworaW50IGZsZXhjb3BfZWVwcm9tX2NoZWNrX21hY19hZGRyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBleHRlbmRlZCk7CisKKy8qIGZyb20gZmxleGNvcC1pMmMuYyAqLworLyogdGhlIFBDSSBwYXJ0IHVzZXMgdGhpcyBhIGkyY19yZXF1ZXN0IGNhbGxiYWNrLCB3aGVyZWFzIHRoZSB1c2IgcGFydCBoYXMgaXRzIG93bgorICogb25lLiBXZSBoYXZlIGl0IGluIGZsZXhjb3AtaTJjLmMsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdmlhIHRoZSBhY3R1YWwKKyAqIEkyQy1jaGFubmVsIG9mIHRoZSBmbGV4Y29wLgorICovCitpbnQgZmxleGNvcF9pMmNfcmVxdWVzdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UqLCBmbGV4Y29wX2FjY2Vzc19vcF90LAorCQkgICAgICAgIGZsZXhjb3BfaTJjX3BvcnRfdCwgdTggY2hpcGFkZHIsIHU4IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pOworCisvKiBmcm9tIGZsZXhjb3Atc3JhbS5jICovCitpbnQgZmxleGNvcF9zcmFtX3NldF9kZXN0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3Bfc3JhbV9kZXN0X3QgZGVzdCwgZmxleGNvcF9zcmFtX2Rlc3RfdGFyZ2V0X3QgdGFyZ2V0KTsKK3ZvaWQgZmxleGNvcF93YW5fc2V0X3NwZWVkKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3Bfd2FuX3NwZWVkX3Qgcyk7Cit2b2lkIGZsZXhjb3Bfc3JhbV9jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCB1c2Jfd2FuLCBpbnQgc3JhbWRtYSwgaW50IG1heGltdW1maWxsKTsKKworLyogZ2xvYmFsIHByb3RvdHlwZXMgZm9yIHRoZSBmbGV4Y29wLWNoaXAgKi8KKy8qIGZyb20gZmxleGNvcC1mZS10dW5lci5jICovCitpbnQgZmxleGNvcF9mcm9udGVuZF9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqY2FyZCk7Cit2b2lkIGZsZXhjb3BfZnJvbnRlbmRfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKKworLyogZnJvbSBmbGV4Y29wLWkyYy5jICovCitpbnQgZmxleGNvcF9pMmNfaW5pdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKK3ZvaWQgZmxleGNvcF9pMmNfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKKworLyogZnJvbSBmbGV4Y29wLXNyYW0uYyAqLworaW50IGZsZXhjb3Bfc3JhbV9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpOworCisvKiBmcm9tIGZsZXhjb3AtbWlzYy5jICovCit2b2lkIGZsZXhjb3BfZGV0ZXJtaW5lX3JldmlzaW9uKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpOwordm9pZCBmbGV4Y29wX2RldmljZV9uYW1lKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsY29uc3QgY2hhciAqcHJlZml4LGNvbnN0IGNoYXIgKnN1ZmZpeCk7CisKKy8qIGZyb20gZmxleGNvcC1ody1maWx0ZXIuYyAqLworaW50IGZsZXhjb3BfcGlkX2ZlZWRfY29udHJvbChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQsIGludCBvbm9mZik7Cit2b2lkIGZsZXhjb3BfaHdfZmlsdGVyX2luaXQoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyk7CisKK3ZvaWQgZmxleGNvcF9zbWNfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpOworCit2b2lkIGZsZXhjb3Bfc2V0X21hY19maWx0ZXIoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgdTggbWFjWzZdKTsKK3ZvaWQgZmxleGNvcF9tYWNfZmlsdGVyX2N0cmwoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgaW50IG9ub2ZmKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNzA2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpbnV4IGRyaXZlciB0aGUgZGlnaXRhbCBUViBkZXZpY2VzIGVxdWlwcGVkIHdpdGggQjJDMiBGbGV4Y29wSUkoYikvSUlJCisgKgorICogZmxleGNvcC1kbWEuYyAtIG1ldGhvZHMgZm9yIGNvbmZpZ3VyaW5nIGFuZCBjb250cm9sbGluZyB0aGUgRE1BIG9mIHRoZSBGbGV4Q29wLgorICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworI2luY2x1ZGUgImZsZXhjb3AuaCIKKworaW50IGZsZXhjb3BfZG1hX2FsbG9jYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgZmxleGNvcF9kbWEgKmRtYSwgdTMyIHNpemUpCit7CisJdTggKnRjcHU7CisJZG1hX2FkZHJfdCB0ZG1hOworCisJaWYgKHNpemUgJSAyKSB7CisJCWVycigiZG1hIGJ1ZmZlcnNpemUgaGFzIHRvIGJlIGV2ZW4uIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgodGNwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZ0ZG1hKSkgIT0gTlVMTCkgeworCQlkbWEtPnBkZXYgPSBwZGV2OworCQlkbWEtPmNwdV9hZGRyMCA9IHRjcHU7CisJCWRtYS0+ZG1hX2FkZHIwID0gdGRtYTsKKwkJZG1hLT5jcHVfYWRkcjEgPSB0Y3B1ICsgc2l6ZS8yOworCQlkbWEtPmRtYV9hZGRyMSA9IHRkbWEgKyBzaXplLzI7CisJCWRtYS0+c2l6ZSA9IHNpemUvMjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9hbGxvY2F0ZSk7CisKK3ZvaWQgZmxleGNvcF9kbWFfZnJlZShzdHJ1Y3QgZmxleGNvcF9kbWEgKmRtYSkKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGRtYS0+cGRldiwgZG1hLT5zaXplKjIsZG1hLT5jcHVfYWRkcjAsIGRtYS0+ZG1hX2FkZHIwKTsKKwltZW1zZXQoZG1hLDAsc2l6ZW9mKHN0cnVjdCBmbGV4Y29wX2RtYSkpOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9mcmVlKTsKKworaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisKKwlpZiAobm8gJiBGQ19ETUFfMSkKKwkJdi5jdHJsXzIwOC5ETUExX1RpbWVyX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWlmIChubyAmIEZDX0RNQV8yKQorCQl2LmN0cmxfMjA4LkRNQTJfVGltZXJfRW5hYmxlX3NpZyA9IG9ub2ZmOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMsY3RybF8yMDgsdik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKTsKKworaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBubywgaW50IG9ub2ZmKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLGN0cmxfMjA4KTsKKworCWlmIChubyAmIEZDX0RNQV8xKQorCQl2LmN0cmxfMjA4LkRNQTFfSVJRX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWlmIChubyAmIEZDX0RNQV8yKQorCQl2LmN0cmxfMjA4LkRNQTJfSVJRX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKTsKKworaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IG5vLCBpbnQgb25vZmYpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOworCisJaWYgKG5vICYgRkNfRE1BXzEpCisJCXYuY3RybF8yMDguRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnID0gb25vZmY7CisKKwlpZiAobm8gJiBGQ19ETUFfMikKKwkJdi5jdHJsXzIwOC5ETUEyX1NpemVfSVJRX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3BhY2tldF9pcnEpOworCitpbnQgZmxleGNvcF9kbWFfY29uZmlnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4KQoreworCisJZmxleGNvcF9pYmlfdmFsdWUgdjB4MCx2MHg0LHYweGM7CisJdjB4MC5yYXcgPSB2MHg0LnJhdyA9IHYweGMucmF3ID0gMDsKKworCXYweDAuZG1hXzB4MC5kbWFfYWRkcmVzczAgICAgICAgID0gZG1hLT5kbWFfYWRkcjAgPj4gMjsKKwl2MHhjLmRtYV8weGMuZG1hX2FkZHJlc3MxICAgICAgICA9IGRtYS0+ZG1hX2FkZHIxID4+IDI7CisJdjB4NC5kbWFfMHg0X3dyaXRlLmRtYV9hZGRyX3NpemUgPSBkbWEtPnNpemUgLyA0OworCisJaWYgKGluZGV4ICYgRkNfRE1BX1NVQkFERFJfMCkKKwkJdjB4MC5kbWFfMHgwLmRtYV8wc3RhcnQgPSAxOworCisJaWYgKGluZGV4ICYgRkNfRE1BX1NVQkFERFJfMSkKKwkJdjB4Yy5kbWFfMHhjLmRtYV8xc3RhcnQgPSAxOworCisJaWYgKGRtYV9pZHggJiBGQ19ETUFfMSkgeworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwMCx2MHgwKTsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMDQsdjB4NCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDBjLHYweGMpOworCX0gZWxzZSB7IC8qIChkbWFfaWR4ICYgRkNfRE1BXzIpICovCisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDEwLHYweDApOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxNCx2MHg0KTsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMWMsdjB4Yyk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZyk7CisKK3N0YXRpYyBpbnQgZmxleGNvcF9kbWFfcmVtYXAoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBkbWFfaWR4LCBpbnQgb25vZmYpCit7CisJZmxleGNvcF9pYmlfcmVnaXN0ZXIgciA9IChkbWFfaWR4ICYgRkNfRE1BXzEpID8gZG1hMV8wMGMgOiBkbWEyXzAxYzsKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxyKTsKKwl2LmRtYV8weGMucmVtYXBfZW5hYmxlID0gb25vZmY7CisJZmMtPndyaXRlX2liaV9yZWcoZmMscix2KTsKKwlyZXR1cm4gMDsKK30KKworLyogMSBjeWNsZXMgPSAxLjk3IG1zZWMgKi8KK2ludCBmbGV4Y29wX2RtYV9jb25maWdfdGltZXIoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBkbWFfaWR4LCB1OCBjeWNsZXMpCit7CisJZmxleGNvcF9pYmlfcmVnaXN0ZXIgciA9IChkbWFfaWR4ICYgRkNfRE1BXzEpID8gZG1hMV8wMDQgOiBkbWEyXzAxNDsKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxyKTsKKworCWZsZXhjb3BfZG1hX3JlbWFwKGZjLGRtYV9pZHgsMCk7CisKKwl2LmRtYV8weDRfd3JpdGUuZG1hdGltZXIgPSBjeWNsZXMgPj4gMTsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb25maWdfdGltZXIpOworCitpbnQgZmxleGNvcF9kbWFfY29uZmlnX3BhY2tldF9jb3VudChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IHBhY2tldHMpCit7CisJZmxleGNvcF9pYmlfcmVnaXN0ZXIgciA9IChkbWFfaWR4ICYgRkNfRE1BXzEpID8gZG1hMV8wMDQgOiBkbWEyXzAxNDsKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxyKTsKKworCWZsZXhjb3BfZG1hX3JlbWFwKGZjLGRtYV9pZHgsMSk7CisKKwl2LmRtYV8weDRfcmVtYXAuRE1BX21heHBhY2tldHMgPSBwYWNrZXRzOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ19wYWNrZXRfY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWVlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiY2YwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZWVwcm9tLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtZWVwcm9tLmMgLSBlZXByb20gYWNjZXNzIG1ldGhvZHMgKGN1cnJlbnRseSBvbmx5IE1BQyBhZGRyZXNzIHJlYWRpbmcgaXMgdXNlZCkKKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKyNpbmNsdWRlICJmbGV4Y29wLmgiCisKKyNpZiAwCisvKkVFUFJPTSAoU2t5c3RhcjIgaGFzIG9uZSAiMjRMQzA4QiIgY2hpcCBvbiBib2FyZCkgKi8KK3N0YXRpYyBpbnQgZWVwcm9tX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKK3sKKwlyZXR1cm4gZmxleF9pMmNfd3JpdGUoYWRhcHRlciwgMHgyMDAwMDAwMCwgMHg1MCwgYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IGVlcHJvbV9scmNfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgbGVuLCB1OCAqd2J1ZiwgdTggKnJidWYsIGludCByZXRyaWVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgeworCQlpZiAoZWVwcm9tX3dyaXRlKGFkYXB0ZXIsIGFkZHIsIHdidWYsIGxlbikgPT0gbGVuKSB7CisJCQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIGFkZHIsIGxlbiwgcmJ1ZiwgcmV0cmllcykgPT0gMSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGVzZSBmdW5jdGlvbnMgY291bGQgYmUgdXNlZCB0byB1bmxvY2sgU2t5U3RhcjIgY2FyZHMuICovCisKK3N0YXRpYyBpbnQgZWVwcm9tX3dyaXRlS2V5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqa2V5LCB1MzIgbGVuKQoreworCXU4IHJidWZbMjBdOworCXU4IHdidWZbMjBdOworCisJaWYgKGxlbiAhPSAxNikKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkod2J1Ziwga2V5LCBsZW4pOworCisJd2J1ZlsxNl0gPSAwOworCXdidWZbMTddID0gMDsKKwl3YnVmWzE4XSA9IDA7CisJd2J1ZlsxOV0gPSBjYWxjX2xyYyh3YnVmLCAxOSk7CisKKwlyZXR1cm4gZWVwcm9tX2xyY193cml0ZShhZGFwdGVyLCAweDNlNCwgMjAsIHdidWYsIHJidWYsIDQpOworfQorCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkS2V5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqa2V5LCB1MzIgbGVuKQoreworCXU4IGJ1ZlsyMF07CisKKwlpZiAobGVuICE9IDE2KQorCQlyZXR1cm4gMDsKKworCWlmIChlZXByb21fbHJjX3JlYWQoYWRhcHRlciwgMHgzZTQsIDIwLCBidWYsIDQpID09IDApCisJCXJldHVybiAwOworCisJbWVtY3B5KGtleSwgYnVmLCBsZW4pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyIGVlcHJvbV9zZXRfbWFjX2FkZHIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgdHlwZSwgdTggKm1hYykKK3sKKwl1OCB0bXBbOF07CisKKwlpZiAodHlwZSAhPSAwKSB7CisJCXRtcFswXSA9IG1hY1swXTsKKwkJdG1wWzFdID0gbWFjWzFdOworCQl0bXBbMl0gPSBtYWNbMl07CisJCXRtcFszXSA9IG1hY1s1XTsKKwkJdG1wWzRdID0gbWFjWzZdOworCQl0bXBbNV0gPSBtYWNbN107CisKKwl9IGVsc2UgeworCisJCXRtcFswXSA9IG1hY1swXTsKKwkJdG1wWzFdID0gbWFjWzFdOworCQl0bXBbMl0gPSBtYWNbMl07CisJCXRtcFszXSA9IG1hY1szXTsKKwkJdG1wWzRdID0gbWFjWzRdOworCQl0bXBbNV0gPSBtYWNbNV07CisJfQorCisJdG1wWzZdID0gMDsKKwl0bXBbN10gPSBjYWxjX2xyYyh0bXAsIDcpOworCisJaWYgKGVlcHJvbV93cml0ZShhZGFwdGVyLCAweDNmOCwgdG1wLCA4KSA9PSA4KQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsZXhjb3BfZWVwcm9tX3JlYWQoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgdTE2IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCit7CisJcmV0dXJuIGZjLT5pMmNfcmVxdWVzdChmYyxGQ19SRUFELEZDX0kyQ19QT1JUX0VFUFJPTSwweDUwLGFkZHIsYnVmLGxlbik7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdTggY2FsY19scmModTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1OCBzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJc3VtID0gc3VtIF4gYnVmW2ldOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF9lZXByb21fcmVxdWVzdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2FjY2Vzc19vcF90IG9wLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbiwgaW50IHJldHJpZXMpCit7CisJaW50IGkscmV0ID0gMDsKKwl1OCBjaGlwYWRkciA9ICAweDUwIHwgKChhZGRyID4+IDgpICYgMyk7CisJZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykKKwkJaWYgKChyZXQgPSBmYy0+aTJjX3JlcXVlc3QoZmMsb3AsRkNfSTJDX1BPUlRfRUVQUk9NLGNoaXBhZGRyLGFkZHIgJiAweGZmLGJ1ZixsZW4pKSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX2VlcHJvbV9scmNfcmVhZChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbiwgaW50IHJldHJpZXMpCit7CisJaW50IHJldCA9IGZsZXhjb3BfZWVwcm9tX3JlcXVlc3QoZmMsRkNfUkVBRCxhZGRyLGJ1ZixsZW4scmV0cmllcyk7CisJaWYgKHJldCA9PSAwKQorCQlpZiAoY2FsY19scmMoYnVmLCBsZW4gLSAxKSAhPSBidWZbbGVuIC0gMV0pCisJCQlyZXQgPSAtRUlOVkFMOworCXJldHVybiByZXQ7Cit9CisKKy8qIEpKJ3MgY29tbWVudCBhYm91dCBleHRlbmRlZCA9PSAxOiBpdCBpcyBub3QgcHJlc2VudGx5IHVzZWQgYW55d2hlcmUgYnV0IHdhcworICogYWRkZWQgdG8gdGhlIGxvdy1sZXZlbCBmdW5jdGlvbnMgZm9yIHBvc3NpYmxlIHN1cHBvcnQgb2YgRVVJNjQKKyAqLworaW50IGZsZXhjb3BfZWVwcm9tX2NoZWNrX21hY19hZGRyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBleHRlbmRlZCkKK3sKKwl1OCBidWZbOF07CisJaW50IHJldCA9IDA7CisKKwlpZiAoKHJldCA9IGZsZXhjb3BfZWVwcm9tX2xyY19yZWFkKGZjLDB4M2Y4LGJ1Ziw4LDQpKSA9PSAwKSB7CisJCWlmIChleHRlbmRlZCAhPSAwKSB7CisJCQllcnIoIlRPRE86IGV4dGVuZGVkIChFVUk2NCkgTUFDIGFkZHJlc3NlcyBhcmVuJ3QgY29tcGxldGVseSBzdXBwb3J0ZWQgeWV0Iik7CisJCQlyZXQgPSAtRUlOVkFMOworLyoJCQltZW1jcHkoZmMtPmR2Yl9hZGFwdGVyLnByb3Bvc2VkX21hYyxidWYsMyk7CisJCQltYWNbM10gPSAweGZlOworCQkJbWFjWzRdID0gMHhmZjsKKwkJCW1lbWNweSgmZmMtPmR2Yl9hZGFwdGVyLnByb3Bvc2VkX21hY1szXSwmYnVmWzVdLDMpOyAqLworCQl9IGVsc2UKKwkJCW1lbWNweShmYy0+ZHZiX2FkYXB0ZXIucHJvcG9zZWRfbWFjLGJ1Ziw2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9lZXByb21fY2hlY2tfbWFjX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJlNDAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtZmUtdHVuZXIuYyAtIG1ldGhvZHMgZm9yIGF0dGFjaGluZyBhIGZyb250ZW5kIGFuZCBjb250cm9sbGluZyBEaVNFcUMuCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSAiZmxleGNvcC5oIgorCisjaW5jbHVkZSAic3R2MDI5OS5oIgorI2luY2x1ZGUgIm10MzUyLmgiCisjaW5jbHVkZSAibnh0MjAwMi5oIgorI2luY2x1ZGUgInN0djAyOTcuaCIKKyNpbmNsdWRlICJtdDMxMi5oIgorCisvKiBsbmIgY29udHJvbCAqLworCitzdGF0aWMgaW50IGZsZXhjb3Bfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKwlmbGV4Y29wX2liaV92YWx1ZSB2OworCWRlYl90dW5lcigicG9sYXJpdHkvdm9sdGFnZSA9ICV1XG4iLCB2b2x0YWdlKTsKKworCXYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLCBtaXNjXzIwNCk7CisJc3dpdGNoICh2b2x0YWdlKSB7CisJCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQkJdi5taXNjXzIwNC5BQ1BJMV9zaWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCQl2Lm1pc2NfMjA0LkFDUEkxX3NpZyA9IDA7CisJCQl2Lm1pc2NfMjA0LkxOQl9MX0hfc2lnID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQkJdi5taXNjXzIwNC5BQ1BJMV9zaWcgPSAwOworCQkJdi5taXNjXzIwNC5MTkJfTF9IX3NpZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigidW5rbm93biBTRUNfVk9MVEFHRSB2YWx1ZSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBmYy0+d3JpdGVfaWJpX3JlZyhmYywgbWlzY18yMDQsIHYpOworfQorCitzdGF0aWMgaW50IGZsZXhjb3Bfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZlLT5kdmItPnByaXY7CisvKglmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxtaXNjXzIwNCk7ICovCisKKwlpZiAoZmMtPmZlX3NsZWVwKQorCQlyZXR1cm4gZmMtPmZlX3NsZWVwKGZlKTsKKworLyoJdi5taXNjXzIwNC5BQ1BJM19zaWcgPSAxOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLG1pc2NfMjA0LHYpOyovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3sKKwkvKiB1MTYgd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oeltdID0geyAweDAxZmYsIDB4MDE1NCwgMHgwMGZmLCAweDAwY2MgfTsgKi8KKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKwlmbGV4Y29wX2liaV92YWx1ZSB2OworCXUxNiBheDsKKwl2LnJhdyA9IDA7CisKKwlkZWJfdHVuZXIoInRvbmUgPSAldVxuIix0b25lKTsKKworCXN3aXRjaCAodG9uZSkgeworCQljYXNlIFNFQ19UT05FX09OOgorCQkJYXggPSAweDAxZmY7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfVE9ORV9PRkY6CisJCQlheCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigidW5rbm93biBTRUNfVE9ORSB2YWx1ZSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdi5sbmJfc3dpdGNoX2ZyZXFfMjAwLkxOQl9DVExQcmVzY2FsZXJfc2lnID0gMTsgLyogZGl2aWRlIGJ5IDIgKi8KKworCXYubG5iX3N3aXRjaF9mcmVxXzIwMC5MTkJfQ1RMSGlnaENvdW50X3NpZyA9IGF4OworCXYubG5iX3N3aXRjaF9mcmVxXzIwMC5MTkJfQ1RMTG93Q291bnRfc2lnICA9IGF4ID09IDAgPyAweDFmZiA6IGF4OworCisJcmV0dXJuIGZjLT53cml0ZV9pYmlfcmVnKGZjLGxuYl9zd2l0Y2hfZnJlcV8yMDAsdik7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfZGlzZXFjX3NlbmRfYml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZGF0YSkKK3sKKwlmbGV4Y29wX3NldF90b25lKGZlLCBTRUNfVE9ORV9PTik7CisJdWRlbGF5KGRhdGEgPyA1MDAgOiAxMDAwKTsKKwlmbGV4Y29wX3NldF90b25lKGZlLCBTRUNfVE9ORV9PRkYpOworCXVkZWxheShkYXRhID8gMTAwMCA6IDUwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfZGlzZXFjX3NlbmRfYnl0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGRhdGEpCit7CisJaW50IGksIHBhciA9IDEsIGQ7CisKKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQlkID0gKGRhdGEgPj4gaSkgJiAxOworCQlwYXIgXj0gZDsKKwkJZmxleGNvcF9kaXNlcWNfc2VuZF9iaXQoZmUsIGQpOworCX0KKworCWZsZXhjb3BfZGlzZXFjX3NlbmRfYml0KGZlLCBwYXIpOworfQorCitzdGF0aWMgaW50IGZsZXhjb3Bfc2VuZF9kaXNlcWNfbXNnKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgbGVuLCB1OCAqbXNnLCB1bnNpZ25lZCBsb25nIGJ1cnN0KQoreworCWludCBpOworCisJZmxleGNvcF9zZXRfdG9uZShmZSwgU0VDX1RPTkVfT0ZGKTsKKwltZGVsYXkoMTYpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlmbGV4Y29wX2Rpc2VxY19zZW5kX2J5dGUoZmUsbXNnW2ldKTsKKworCW1kZWxheSgxNik7CisKKwlpZiAoYnVyc3QgIT0gLTEpIHsKKwkJaWYgKGJ1cnN0KQorCQkJZmxleGNvcF9kaXNlcWNfc2VuZF9ieXRlKGZlLCAweGZmKTsKKwkJZWxzZSB7CisJCQlmbGV4Y29wX3NldF90b25lKGZlLCBTRUNfVE9ORV9PTik7CisJCQl1ZGVsYXkoMTI1MDApOworCQkJZmxleGNvcF9zZXRfdG9uZShmZSwgU0VDX1RPTkVfT0ZGKTsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3sKKwlyZXR1cm4gZmxleGNvcF9zZW5kX2Rpc2VxY19tc2coZmUsIGNtZC0+bXNnX2xlbiwgY21kLT5tc2csIDApOworfQorCitzdGF0aWMgaW50IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCit7CisJcmV0dXJuIGZsZXhjb3Bfc2VuZF9kaXNlcWNfbXNnKGZlLCAwLCBOVUxMLCBtaW5pY21kKTsKK30KKworLyogZHZiLXMgc3R2MDI5OSAqLworc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9zZXRfc3ltYm9sX3JhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBzcmF0ZSwgdTMyIHJhdGlvKQoreworCXU4IGFjbGsgPSAwOworCXU4IGJjbGsgPSAwOworCisJaWYgKHNyYXRlIDwgMTUwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NDc7IH0KKwllbHNlIGlmIChzcmF0ZSA8IDMwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDRiOyB9CisJZWxzZSBpZiAoc3JhdGUgPCA3MDAwMDAwKSB7IGFjbGsgPSAweGI3OyBiY2xrID0gMHg0ZjsgfQorCWVsc2UgaWYgKHNyYXRlIDwgMTQwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDUzOyB9CisJZWxzZSBpZiAoc3JhdGUgPCAzMDAwMDAwMCkgeyBhY2xrID0gMHhiNjsgYmNsayA9IDB4NTM7IH0KKwllbHNlIGlmIChzcmF0ZSA8IDQ1MDAwMDAwKSB7IGFjbGsgPSAweGI0OyBiY2xrID0gMHg1MTsgfQorCisJc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MTMsIGFjbGspOworCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDE0LCBiY2xrKTsKKwlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgxZiwgKHJhdGlvID4+IDE2KSAmIDB4ZmYpOworCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDIwLCAocmF0aW8gPj4gIDgpICYgMHhmZik7CisJc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MjEsIChyYXRpbyAgICAgICkgJiAweGYwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQoreworCXU4IGJ1Zls0XTsKKwl1MzIgZGl2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKworCWRpdiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTI1OworCisJYnVmWzBdID0gKGRpdiA+PiA4KSAmIDB4N2Y7CisJYnVmWzFdID0gZGl2ICYgMHhmZjsKKwlidWZbMl0gPSAweDg0OyAgLyogMHhDNCAqLworCWJ1ZlszXSA9IDB4MDg7CisKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwKSBidWZbM10gfD0gMHgxMDsKKworCWlmIChpMmNfdHJhbnNmZXIoJmZjLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzYW1zdW5nX3RibXUyNDExMl9pbml0dGFiW10gPSB7CisJICAgICAweDAxLCAweDE1LAorCSAgICAgMHgwMiwgMHgzMCwKKwkgICAgIDB4MDMsIDB4MDAsCisJICAgICAweDA0LCAweDdELAorCSAgICAgMHgwNSwgMHgzNSwKKwkgICAgIDB4MDYsIDB4MDIsCisJICAgICAweDA3LCAweDAwLAorCSAgICAgMHgwOCwgMHhDMywKKwkgICAgIDB4MEMsIDB4MDAsCisJICAgICAweDBELCAweDgxLAorCSAgICAgMHgwRSwgMHgyMywKKwkgICAgIDB4MEYsIDB4MTIsCisJICAgICAweDEwLCAweDdFLAorCSAgICAgMHgxMSwgMHg4NCwKKwkgICAgIDB4MTIsIDB4QjksCisJICAgICAweDEzLCAweDg4LAorCSAgICAgMHgxNCwgMHg4OSwKKwkgICAgIDB4MTUsIDB4QzksCisJICAgICAweDE2LCAweDAwLAorCSAgICAgMHgxNywgMHg1QywKKwkgICAgIDB4MTgsIDB4MDAsCisJICAgICAweDE5LCAweDAwLAorCSAgICAgMHgxQSwgMHgwMCwKKwkgICAgIDB4MUMsIDB4MDAsCisJICAgICAweDFELCAweDAwLAorCSAgICAgMHgxRSwgMHgwMCwKKwkgICAgIDB4MUYsIDB4M0EsCisJICAgICAweDIwLCAweDJFLAorCSAgICAgMHgyMSwgMHg4MCwKKwkgICAgIDB4MjIsIDB4RkYsCisJICAgICAweDIzLCAweEMxLAorCSAgICAgMHgyOCwgMHgwMCwKKwkgICAgIDB4MjksIDB4MUUsCisJICAgICAweDJBLCAweDE0LAorCSAgICAgMHgyQiwgMHgwRiwKKwkgICAgIDB4MkMsIDB4MDksCisJICAgICAweDJELCAweDA1LAorCSAgICAgMHgzMSwgMHgxRiwKKwkgICAgIDB4MzIsIDB4MTksCisJICAgICAweDMzLCAweEZFLAorCSAgICAgMHgzNCwgMHg5MywKKwkgICAgIDB4ZmYsIDB4ZmYsCit9OworCitzdGF0aWMgc3RydWN0IHN0djAyOTlfY29uZmlnIHNhbXN1bmdfdGJtdTI0MTEyX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCisJLmluaXR0YWIgPSBzYW1zdW5nX3RibXUyNDExMl9pbml0dGFiLAorCS5tY2xrID0gODgwMDAwMDBVTCwKKwkuaW52ZXJ0ID0gMCwKKwkuZW5oYW5jZWRfdHVuaW5nID0gMCwKKwkuc2tpcF9yZWluaXQgPSAwLAorCS5sb2NrX291dHB1dCA9IFNUVjAyMjlfTE9DS09VVFBVVF9MSywKKwkudm9sdDEzX29wMF9vcDEgPSBTVFYwMjk5X1ZPTFQxM19PUDEsCisJLm1pbl9kZWxheV9tcyA9IDEwMCwKKwkuc2V0X3N5bWJvbF9yYXRlID0gc2Ftc3VuZ190Ym11MjQxMTJfc2V0X3N5bWJvbF9yYXRlLAorCS5wbGxfc2V0ID0gc2Ftc3VuZ190Ym11MjQxMTJfcGxsX3NldCwKK307CisKKy8qIGR2Yi10IG10MzUyICovCitzdGF0aWMgaW50IHNhbXN1bmdfdGR0YzkyNTFkaDBfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdGF0aWMgdTggbXQzNTJfY2xvY2tfY29uZmlnIFtdID0geyAweDg5LCAweDE4LCAweDJkIH07CisJc3RhdGljIHU4IG10MzUyX3Jlc2V0IFtdID0geyAweDUwLCAweDgwIH07CisJc3RhdGljIHU4IG10MzUyX2FkY19jdGxfMV9jZmcgW10gPSB7IDB4OEUsIDB4NDAgfTsKKwlzdGF0aWMgdTggbXQzNTJfYWdjX2NmZyBbXSA9IHsgMHg2NywgMHgyOCwgMHhhMSB9OworCXN0YXRpYyB1OCBtdDM1Ml9jYXB0X3JhbmdlX2NmZ1tdID0geyAweDc1LCAweDMyIH07CisKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2xvY2tfY29uZmlnLCBzaXplb2YobXQzNTJfY2xvY2tfY29uZmlnKSk7CisJdWRlbGF5KDIwMDApOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FkY19jdGxfMV9jZmcsIHNpemVvZihtdDM1Ml9hZGNfY3RsXzFfY2ZnKSk7CisKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWdjX2NmZywgc2l6ZW9mKG10MzUyX2FnY19jZmcpKTsKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2FwdF9yYW5nZV9jZmcsIHNpemVvZihtdDM1Ml9jYXB0X3JhbmdlX2NmZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZikKK3sKKwl1MzIgZGl2OworCXVuc2lnbmVkIGNoYXIgYnMgPSAwOworCisJI2RlZmluZSBJRl9GUkVRVUVOQ1l4NiAyMTcgICAgLyogNiAqIDM2LjE2NjY2NjY2NjY3TUh6ICovCisJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKKworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0ODAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSAxNTQwMDAwMDApIGJzID0gMHgwOTsKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gMTYxMDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDQzOTAwMDAwMCkgYnMgPSAweDBhOworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0NDcwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gODYzMDAwMDAwKSBicyA9IDB4MDg7CisKKwlwbGxidWZbMF0gPSAweGMyOyAvKiBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzICovCisJcGxsYnVmWzFdID0gZGl2ID4+IDg7CisJcGxsYnVmWzJdID0gZGl2ICYgMHhmZjsKKwlwbGxidWZbM10gPSAweGNjOworCXBsbGJ1Zls0XSA9IGJzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHNhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnID0geworCisJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAorCS5kZW1vZF9pbml0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAorCS5wbGxfc2V0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAorfTsKKworc3RhdGljIGludCBueHQyMDAyX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQoreworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmZS0+ZHZiLT5wcml2OworCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCBmYy0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBueHQyMDAyX2NvbmZpZyBzYW1zdW5nX3RibXZfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IG54dDIwMDJfcmVxdWVzdF9maXJtd2FyZSwKK307CisKK3N0YXRpYyBpbnQgc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQoreworCXU4IGJ1Zls0XTsKKwl1MzIgZGl2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKworCWRpdiA9IChwYXJhbXMtPmZyZXF1ZW5jeSArICgxMjUvMikpIC8gMTI1OworCisJYnVmWzBdID0gKGRpdiA+PiA4KSAmIDB4N2Y7CisJYnVmWzFdID0gKGRpdiA+PiAwKSAmIDB4ZmY7CisJYnVmWzJdID0gMHg4NCB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOworCWJ1ZlszXSA9IDB4ODA7CisKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTUwMDAwKQorCQlidWZbM10gfD0gMHgwMjsKKworCWlmIChpMmNfdHJhbnNmZXIoJmZjLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXQzMTJfY29uZmlnIHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcgPSB7CisKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCisJLnBsbF9zZXQgPSBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MWMsCisvLwkuaW52ZXJ0ID0gMSwKKy8vCS5wbGxfc2V0ID0gYWxwc190ZGVlNF9zdHYwMjk3X3BsbF9zZXQsCit9OworCisvKiB0cnkgdG8gZmlndXJlIG91dCB0aGUgZnJvbnRlbmQsIGVhY2ggY2FyZC9ib3ggY2FuIGhhdmUgb24gb2YgdGhlIGZvbGxvd2luZyBsaXN0ICovCitpbnQgZmxleGNvcF9mcm9udGVuZF9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJLyogdHJ5IHRoZSBza3kgdjIuNiAoc3R2MDI5OS9TYW1zdW5nIHRibXUyNDExMihzbDE5MzUpKSAqLworCWlmICgoZmMtPmZlID0gc3R2MDI5OV9hdHRhY2goJnNhbXN1bmdfdGJtdTI0MTEyX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKKwkJZmMtPmZlLT5vcHMtPnNldF92b2x0YWdlID0gZmxleGNvcF9zZXRfdm9sdGFnZTsKKworCQlmYy0+ZmVfc2xlZXAgICAgICAgICAgICAgPSBmYy0+ZmUtPm9wcy0+c2xlZXA7CisJCWZjLT5mZS0+b3BzLT5zbGVlcCAgICAgICA9IGZsZXhjb3Bfc2xlZXA7CisKKwkJZmMtPmRldl90eXBlICAgICAgICAgID0gRkNfU0tZOworCQlpbmZvKCJmb3VuZCB0aGUgc3R2MDI5OSBhdCBpMmMgYWRkcmVzczogMHglMDJ4IixzYW1zdW5nX3RibXUyNDExMl9jb25maWcuZGVtb2RfYWRkcmVzcyk7CisJfSBlbHNlCisJLyogdHJ5IHRoZSBhaXIgZHZiLXQgKG10MzUyL1NhbXN1bmcgdGR0YzkyNTFkaDAoPz8pKSAqLworCWlmICgoZmMtPmZlID0gbXQzNTJfYXR0YWNoKCZzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwgKSB7CisJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9EVkI7CisJCWluZm8oImZvdW5kIHRoZSBtdDM1MiBhdCBpMmMgYWRkcmVzczogMHglMDJ4IixzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKKwl9IGVsc2UKKwkvKiB0cnkgdGhlIGFpciBhdHNjIChueHQyMDAyKSAqLworCWlmICgoZmMtPmZlID0gbnh0MjAwMl9hdHRhY2goJnNhbXN1bmdfdGJtdl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9BVFNDOworCQlpbmZvKCJmb3VuZCB0aGUgbnh0MjAwMiBhdCBpMmMgYWRkcmVzczogMHglMDJ4IixzYW1zdW5nX3RibXZfY29uZmlnLmRlbW9kX2FkZHJlc3MpOworCX0gZWxzZQorCS8qIHRyeSB0aGUgY2FibGUgZHZiIChzdHYwMjk3KSAqLworCWlmICgoZmMtPmZlID0gc3R2MDI5N19hdHRhY2goJmFscHNfdGRlZTRfc3R2MDI5N19jb25maWcsICZmYy0+aTJjX2FkYXAsIDB4ZjgpKSAhPSBOVUxMKSB7CisJCWZjLT5kZXZfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0gRkNfQ0FCTEU7CisJCWluZm8oImZvdW5kIHRoZSBzdHYwMjk3IGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLGFscHNfdGRlZTRfc3R2MDI5N19jb25maWcuZGVtb2RfYWRkcmVzcyk7CisJfSBlbHNlCisJLyogdHJ5IHRoZSBza3kgdjIuMyAodnAzMTAvU2Ftc3VuZyB0YmR1MTgxMzIodHNhNTA1OSkpICovCisJaWYgKChmYy0+ZmUgPSB2cDMxMF9hdHRhY2goJnNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisJCWZjLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOworCQlmYy0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgICAgICA9IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCWZjLT5mZS0+b3BzLT5zZXRfdG9uZSAgICAgICAgICAgICAgID0gZmxleGNvcF9zZXRfdG9uZTsKKwkJZmMtPmZlLT5vcHMtPnNldF92b2x0YWdlICAgICAgICAgICAgPSBmbGV4Y29wX3NldF92b2x0YWdlOworCisJCWZjLT5mZV9zbGVlcCAgICAgICAgICAgICAgICAgICAgICAgID0gZmMtPmZlLT5vcHMtPnNsZWVwOworCQlmYy0+ZmUtPm9wcy0+c2xlZXAgICAgICAgICAgICAgICAgICA9IGZsZXhjb3Bfc2xlZXA7CisKKwkJZmMtPmRldl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBGQ19TS1lfT0xEOworCQlpbmZvKCJmb3VuZCB0aGUgdnAzMTAgKGFrYSBtdDMxMikgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKKwl9CisKKwlpZiAoZmMtPmZlID09IE5VTEwpIHsKKwkJZXJyKCJubyBmcm9udGVuZCBkcml2ZXIgZm91bmQgZm9yIHRoaXMgQjJDMi9GbGV4Q29wIGFkYXB0ZXIiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZmMtPmR2Yl9hZGFwdGVyLCBmYy0+ZmUpKSB7CisJCQllcnIoImZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhIik7CisJCQlpZiAoZmMtPmZlLT5vcHMtPnJlbGVhc2UgIT0gTlVMTCkKKwkJCQlmYy0+ZmUtPm9wcy0+cmVsZWFzZShmYy0+ZmUpOworCQkJZmMtPmZlID0gTlVMTDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWZjLT5pbml0X3N0YXRlIHw9IEZDX1NUQVRFX0ZFX0lOSVQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmxleGNvcF9mcm9udGVuZF9leGl0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJaWYgKGZjLT5pbml0X3N0YXRlICYgRkNfU1RBVEVfRkVfSU5JVCkKKwkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZmMtPmZlKTsKKworCWZjLT5pbml0X3N0YXRlICY9IH5GQ19TVEFURV9GRV9JTklUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYWY0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaHctZmlsdGVyLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtaHctZmlsdGVyLmMgLSBwaWQgYW5kIG1hYyBhZGRyZXNzIGZpbHRlcmluZyBhbmQgY29ycmVzcG9uZGluZyBjb250cm9sIGZ1bmN0aW9ucy4KKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKyNpbmNsdWRlICJmbGV4Y29wLmgiCisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcmN2X2RhdGFfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCit7CisJZmxleGNvcF9zZXRfaWJpX3ZhbHVlKGN0cmxfMjA4LFJjdl9EYXRhX3NpZyxvbm9mZik7Cit9CisKK3ZvaWQgZmxleGNvcF9zbWNfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCit7CisJZmxleGNvcF9zZXRfaWJpX3ZhbHVlKGN0cmxfMjA4LFNNQ19FbmFibGVfc2lnLG9ub2ZmKTsKK30KKwordm9pZCBmbGV4Y29wX251bGxfZmlsdGVyX2N0cmwoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgaW50IG9ub2ZmKQoreworCWZsZXhjb3Bfc2V0X2liaV92YWx1ZShjdHJsXzIwOCxOdWxsX2ZpbHRlcl9zaWcsb25vZmYpOworfQorCit2b2lkIGZsZXhjb3Bfc2V0X21hY19maWx0ZXIoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgdTggbWFjWzZdKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHY0MTgsdjQxYzsKKwl2NDFjID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxtYWNfYWRkcmVzc180MWMpOworCisJdjQxOC5tYWNfYWRkcmVzc180MTguTUFDMSA9IG1hY1swXTsKKwl2NDE4Lm1hY19hZGRyZXNzXzQxOC5NQUMyID0gbWFjWzFdOworCXY0MTgubWFjX2FkZHJlc3NfNDE4Lk1BQzMgPSBtYWNbMl07CisJdjQxOC5tYWNfYWRkcmVzc180MTguTUFDNiA9IG1hY1szXTsKKwl2NDFjLm1hY19hZGRyZXNzXzQxYy5NQUM3ID0gbWFjWzRdOworCXY0MWMubWFjX2FkZHJlc3NfNDFjLk1BQzggPSBtYWNbNV07CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxtYWNfYWRkcmVzc180MTgsdjQxOCk7CisJZmMtPndyaXRlX2liaV9yZWcoZmMsbWFjX2FkZHJlc3NfNDFjLHY0MWMpOworfQorCit2b2lkIGZsZXhjb3BfbWFjX2ZpbHRlcl9jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBvbm9mZikKK3sKKwlmbGV4Y29wX3NldF9pYmlfdmFsdWUoY3RybF8yMDgsTUFDX2ZpbHRlcl9Nb2RlX3NpZyxvbm9mZik7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX2dyb3VwX2ZpbHRlcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCB1MTYgbWFzaykKK3sKKwkvKiBpbmRleF9yZWdfMzEwLmV4dHJhX2luZGV4X3JlZyBuZWVkIHRvIDAgb3IgNyB0byB3b3JrICovCisJZmxleGNvcF9pYmlfdmFsdWUgdjMwYzsKKwl2MzBjLnBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83Lkdyb3VwX1BJRCA9IHBpZDsKKwl2MzBjLnBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83Lkdyb3VwX21hc2sgPSBtYXNrOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHBpZF9maWx0ZXJfMzBjLHYzMGMpOworfQorCitzdGF0aWMgdm9pZCBmbGV4Y29wX3BpZF9ncm91cF9maWx0ZXJfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBpbnQgb25vZmYpCit7CisJZmxleGNvcF9zZXRfaWJpX3ZhbHVlKGN0cmxfMjA4LE1hc2tfZmlsdGVyX3NpZyxvbm9mZik7Cit9CisKKy8qIHRoaXMgZmFuY3kgZGVmaW5lIHJlZHVjZXMgdGhlIGNvZGUgc2l6ZSBvZiB0aGUgcXVpdGUgc2ltaWxhciBQSUQgY29udHJvbGxpbmcgb2YKKyAqIHRoZSBmaXJzdCA2IFBJRHMKKyAqLworCisjZGVmaW5lIHBpZF9jdHJsKHZyZWduYW1lLGZpZWxkLGVuYWJsZWZpZWxkLHRyYW5zX2ZpZWxkLHRyYW5zdmFsKSBcCisJZmxleGNvcF9pYmlfdmFsdWUgdnBpZCA9IGZjLT5yZWFkX2liaV9yZWcoZmMsIHZyZWduYW1lKSwgXAorCQkJCQkgIHYyMDggPSBmYy0+cmVhZF9pYmlfcmVnKGZjLCBjdHJsXzIwOCk7IFwKK1wKKwl2cGlkLnZyZWduYW1lLmZpZWxkID0gb25vZmYgPyBwaWQgOiAweDFmZmY7IFwKKwl2cGlkLnZyZWduYW1lLnRyYW5zX2ZpZWxkID0gdHJhbnN2YWw7IFwKKwl2MjA4LmN0cmxfMjA4LmVuYWJsZWZpZWxkID0gb25vZmY7IFwKK1wKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyx2cmVnbmFtZSx2cGlkKTsgXAorCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYyMDgpOworCitzdGF0aWMgdm9pZCBmbGV4Y29wX3BpZF9TdHJlYW0xX1BJRF9jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwlwaWRfY3RybChwaWRfZmlsdGVyXzMwMCxTdHJlYW0xX1BJRCxTdHJlYW0xX2ZpbHRlcl9zaWcsU3RyZWFtMV90cmFucywwKTsKK30KKworc3RhdGljIHZvaWQgZmxleGNvcF9waWRfU3RyZWFtMl9QSURfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCBpbnQgb25vZmYpCit7CisJcGlkX2N0cmwocGlkX2ZpbHRlcl8zMDAsU3RyZWFtMl9QSUQsU3RyZWFtMl9maWx0ZXJfc2lnLFN0cmVhbTJfdHJhbnMsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX1BDUl9QSURfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCBpbnQgb25vZmYpCit7CisJcGlkX2N0cmwocGlkX2ZpbHRlcl8zMDQsUENSX1BJRCxQQ1JfZmlsdGVyX3NpZyxQQ1JfdHJhbnMsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX1BNVF9QSURfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCBpbnQgb25vZmYpCit7CisJcGlkX2N0cmwocGlkX2ZpbHRlcl8zMDQsUE1UX1BJRCxQTVRfZmlsdGVyX3NpZyxQTVRfdHJhbnMsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX0VNTV9QSURfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCBpbnQgb25vZmYpCit7CisJcGlkX2N0cmwocGlkX2ZpbHRlcl8zMDgsRU1NX1BJRCxFTU1fZmlsdGVyX3NpZyxFTU1fdHJhbnMsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX0VDTV9QSURfY3RybChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1MTYgcGlkLCBpbnQgb25vZmYpCit7CisJcGlkX2N0cmwocGlkX2ZpbHRlcl8zMDgsRUNNX1BJRCxFQ01fZmlsdGVyX3NpZyxFQ01fdHJhbnMsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGlkX2NvbnRyb2woc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgaW50IGluZGV4LCB1MTYgcGlkLGludCBvbm9mZikKK3sKKwlpZiAocGlkID09IDB4MjAwMCkKKwkJcmV0dXJuOworCisJZGViX3RzKCJzZXR0aW5nIHBpZDogJTVkICUwNHggYXQgaW5kZXggJWQgJyVzJ1xuIixwaWQscGlkLGluZGV4LG9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKKworCS8qIFdlIGNvdWxkIHVzZSBiaXQgbWFnaWMgaGVyZSB0byByZWR1Y2Ugc291cmNlIGNvZGUgc2l6ZS4KKwkgKiBJIGRlY2lkZWQgYWdhaW5zdCBpdCwgYnV0IHRvIHVzZSB0aGUgcmVhbCByZWdpc3RlciBuYW1lcyAqLworCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOiBmbGV4Y29wX3BpZF9TdHJlYW0xX1BJRF9jdHJsKGZjLHBpZCxvbm9mZik7IGJyZWFrOworCQljYXNlIDE6IGZsZXhjb3BfcGlkX1N0cmVhbTJfUElEX2N0cmwoZmMscGlkLG9ub2ZmKTsgYnJlYWs7CisJCWNhc2UgMjogZmxleGNvcF9waWRfUENSX1BJRF9jdHJsKGZjLHBpZCxvbm9mZik7IGJyZWFrOworCQljYXNlIDM6IGZsZXhjb3BfcGlkX1BNVF9QSURfY3RybChmYyxwaWQsb25vZmYpOyBicmVhazsKKwkJY2FzZSA0OiBmbGV4Y29wX3BpZF9FTU1fUElEX2N0cmwoZmMscGlkLG9ub2ZmKTsgYnJlYWs7CisJCWNhc2UgNToJZmxleGNvcF9waWRfRUNNX1BJRF9jdHJsKGZjLHBpZCxvbm9mZik7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGZjLT5oYXNfMzJfaHdfcGlkX2ZpbHRlciAmJiBpbmRleCA8IDM4KSB7CisJCQkJZmxleGNvcF9pYmlfdmFsdWUgdnBpZCx2aWQ7CisKKwkJCQkvKiBzZXQgdGhlIGluZGV4ICovCisJCQkJdmlkID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxpbmRleF9yZWdfMzEwKTsKKwkJCQl2aWQuaW5kZXhfcmVnXzMxMC5pbmRleF9yZWcgPSBpbmRleCAtIDY7CisJCQkJZmMtPndyaXRlX2liaV9yZWcoZmMsaW5kZXhfcmVnXzMxMCwgdmlkKTsKKworCQkJCXZwaWQgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHBpZF9uX3JlZ18zMTQpOworCQkJCXZwaWQucGlkX25fcmVnXzMxNC5QSUQgPSBvbm9mZiA/IHBpZCA6IDB4MWZmZjsKKwkJCQl2cGlkLnBpZF9uX3JlZ18zMTQuUElEX2VuYWJsZV9iaXQgPSBvbm9mZjsKKwkJCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxwaWRfbl9yZWdfMzE0LCB2cGlkKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBmbGV4Y29wX3RvZ2dsZV9mdWxsdHNfc3RyZWFtaW5nKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsaW50IG9ub2ZmKQoreworCWlmIChmYy0+ZnVsbHRzX3N0cmVhbWluZ19zdGF0ZSAhPSBvbm9mZikgeworCQlkZWJfdHMoIiVzIGZ1bGwgVFMgdHJhbnNmZXJcbiIsb25vZmYgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworCQlmbGV4Y29wX3BpZF9ncm91cF9maWx0ZXIoZmMsIDAsIDB4MWZlMCAqICghb25vZmYpKTsKKwkJZmxleGNvcF9waWRfZ3JvdXBfZmlsdGVyX2N0cmwoZmMsb25vZmYpOworCQlmYy0+ZnVsbHRzX3N0cmVhbWluZ19zdGF0ZSA9IG9ub2ZmOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZsZXhjb3BfcGlkX2ZlZWRfY29udHJvbChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQsIGludCBvbm9mZikKK3sKKwlpbnQgbWF4X3BpZF9maWx0ZXIgPSA2ICsgZmMtPmhhc18zMl9od19waWRfZmlsdGVyKjMyOworCisJZmMtPmZlZWRjb3VudCArPSBvbm9mZiA/IDEgOiAtMTsKKwlpZiAoZHZiZG14ZmVlZC0+aW5kZXggPj0gbWF4X3BpZF9maWx0ZXIpCisJCWZjLT5leHRyYV9mZWVkY291bnQgKz0gb25vZmYgPyAxIDogLTE7CisKKwkvKiB0b2dnbGUgY29tcGxldGUtVFMtc3RyZWFtaW5nIHdoZW46CisJICogLSBwaWRfZmlsdGVyaW5nIGlzIG5vdCBlbmFibGVkIGFuZCBpdCBpcyB0aGUgZmlyc3Qgb3IgbGFzdCBmZWVkIHJlcXVlc3RlZAorCSAqIC0gcGlkX2ZpbHRlcmluZyBpcyBlbmFibGVkLAorCSAqICAgLSBidXQgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZmVlZHMgaXMgZXhjZWVkZWQKKwkgKiAgIC0gb3IgdGhlIHJlcXVlc3RlZCBwaWQgaXMgMHgyMDAwICovCisKKwlpZiAoIWZjLT5waWRfZmlsdGVyaW5nICYmIGZjLT5mZWVkY291bnQgPT0gb25vZmYpCisJCWZsZXhjb3BfdG9nZ2xlX2Z1bGx0c19zdHJlYW1pbmcoZmMsb25vZmYpOworCisJaWYgKGZjLT5waWRfZmlsdGVyaW5nKSB7CisJCWZsZXhjb3BfcGlkX2NvbnRyb2woZmMsZHZiZG14ZmVlZC0+aW5kZXgsZHZiZG14ZmVlZC0+cGlkLG9ub2ZmKTsKKworCQlpZiAoZmMtPmV4dHJhX2ZlZWRjb3VudCA+IDApCisJCQlmbGV4Y29wX3RvZ2dsZV9mdWxsdHNfc3RyZWFtaW5nKGZjLDEpOworCQllbHNlIGlmIChkdmJkbXhmZWVkLT5waWQgPT0gMHgyMDAwKQorCQkJZmxleGNvcF90b2dnbGVfZnVsbHRzX3N0cmVhbWluZyhmYyxvbm9mZik7CisJCWVsc2UKKwkJCWZsZXhjb3BfdG9nZ2xlX2Z1bGx0c19zdHJlYW1pbmcoZmMsMCk7CisJfQorCisJLyogaWYgaXQgd2FzIHRoZSBmaXJzdCBvciBsYXN0IGZlZWQgcmVxdWVzdCBjaGFuZ2UgdGhlIHN0cmVhbS1zdGF0dXMgKi8KKwlpZiAoZmMtPmZlZWRjb3VudCA9PSBvbm9mZikgeworCQlmbGV4Y29wX3Jjdl9kYXRhX2N0cmwoZmMsb25vZmYpOworCQlpZiAoZmMtPnN0cmVhbV9jb250cm9sKQorCQkJZmMtPnN0cmVhbV9jb250cm9sKGZjLG9ub2ZmKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmbGV4Y29wX2h3X2ZpbHRlcl9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJaW50IGk7CisJZmxleGNvcF9pYmlfdmFsdWUgdjsKKwlmb3IgKGkgPSAwOyBpIDwgNiArIDMyKmZjLT5oYXNfMzJfaHdfcGlkX2ZpbHRlcjsgaSsrKQorCQlmbGV4Y29wX3BpZF9jb250cm9sKGZjLGksMHgxZmZmLDApOworCisJZmxleGNvcF9waWRfZ3JvdXBfZmlsdGVyKGZjLCAwLCAweDFmZTApOworCWZsZXhjb3BfcGlkX2dyb3VwX2ZpbHRlcl9jdHJsKGZjLDApOworCisJdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMscGlkX2ZpbHRlcl8zMDgpOworCXYucGlkX2ZpbHRlcl8zMDguRU1NX2ZpbHRlcl80ID0gMTsKKwl2LnBpZF9maWx0ZXJfMzA4LkVNTV9maWx0ZXJfNiA9IDA7CisJZmMtPndyaXRlX2liaV9yZWcoZmMscGlkX2ZpbHRlcl8zMDgsdik7CisKKwlmbGV4Y29wX251bGxfZmlsdGVyX2N0cmwoZmMsIDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDI2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaTJjLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtaTJjLmMgLSBmbGV4Y29wIGludGVybmFsIDJXaXJlIGJ1cyAoSTJDKSBhbmQgZHZiIGkyYyBpbml0aWFsaXphdGlvbgorICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworI2luY2x1ZGUgImZsZXhjb3AuaCIKKworI2RlZmluZSBGQ19NQVhfSTJDX1JFVFJJRVMgMTAwMDAwCisKK3N0YXRpYyBpbnQgZmxleGNvcF9pMmNfb3BlcmF0aW9uKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3ZhbHVlICpyMTAwKQoreworCWludCBpOworCWZsZXhjb3BfaWJpX3ZhbHVlIHI7CisKKwlyMTAwLT50d19zbV9jXzEwMC53b3JraW5nX3N0YXJ0ID0gMTsKKwlkZWJfaTJjKCJyMTAwIGJlZm9yZTogJTA4eFxuIixyMTAwLT5yYXcpOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMsIHR3X3NtX2NfMTAwLCBpYmlfemVybyk7CisJZmMtPndyaXRlX2liaV9yZWcoZmMsIHR3X3NtX2NfMTAwLCAqcjEwMCk7IC8qIGluaXRpYXRpbmcgaTJjIG9wZXJhdGlvbiAqLworCisJZm9yIChpID0gMDsgaSA8IEZDX01BWF9JMkNfUkVUUklFUzsgaSsrKSB7CisJCXIgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLCB0d19zbV9jXzEwMCk7CisKKwkJaWYgKCFyLnR3X3NtX2NfMTAwLm5vX2Jhc2VfYWRkcl9hY2tfZXJyb3IpIHsKKwkJCWlmIChyLnR3X3NtX2NfMTAwLnN0X2RvbmUpIHsgIC8qICYmICFyLnR3X3NtX2NfMTAwLndvcmtpbmdfc3RhcnQgKi8KKwkJCQkqcjEwMCA9IHI7CisJCQkJZGViX2kyYygiaTJjIHN1Y2Nlc3NcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJZGViX2kyYygic3VmZmVyaW5nIGZyb20gYW4gaTJjIGFja19lcnJvclxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKwlkZWJfaTJjKCJ0cmllZCAlZCB0aW1lcyBpMmMgb3BlcmF0aW9uLCBuZXZlciBmaW5pc2hlZCBvciB0b28gbWFueSBhY2sgZXJyb3JzLlxuIixpKTsKKwlyZXR1cm4gLUVSRU1PVEVJTzsKK30KKworc3RhdGljIGludCBmbGV4Y29wX2kyY19yZWFkNChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2liaV92YWx1ZSByMTAwLCB1OCAqYnVmKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHIxMDQ7CisJaW50IGxlbiA9IHIxMDAudHdfc21fY18xMDAudG90YWxfYnl0ZXMsIC8qIHJlbWVtYmVyIHRvdGFsX2J5dGVzIGlzIGJ1Zmxlbi0xICovCisJCXJldDsKKworCWlmICgocmV0ID0gZmxleGNvcF9pMmNfb3BlcmF0aW9uKGZjLCZyMTAwKSkgIT0gMCkgeworCQkvKiBUaGUgQ2FibGVzdGFyIG5lZWRzIGEgZGlmZmVyZW50IGtpbmQgb2YgaTJjLXRyYW5zZmVyIChkb2VzIG5vdAorCQkgKiBzdXBwb3J0ICJSZXBlYXQgU3RhcnQiKToKKwkJICogd2FpdCBmb3IgdGhlIEFDSyBmYWlsdXJlLAorCQkgKiBhbmQgZG8gYSBzdWJzZXF1ZW50IHJlYWQgd2l0aCB0aGUgQml0IDMwIGVuYWJsZWQKKwkJICovCisJCXIxMDAudHdfc21fY18xMDAubm9fYmFzZV9hZGRyX2Fja19lcnJvciA9IDE7CisJCWlmICgocmV0ID0gZmxleGNvcF9pMmNfb3BlcmF0aW9uKGZjLCZyMTAwKSkgIT0gMCkgeworCQkJZGViX2kyYygibm9fYmFzZV9hZGRyIHJlYWQgZmFpbGVkLiAlZFxuIixyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWJ1ZlswXSA9IHIxMDAudHdfc21fY18xMDAuZGF0YTFfcmVnOworCisJaWYgKGxlbiA+IDApIHsKKwkJcjEwNCA9IGZjLT5yZWFkX2liaV9yZWcoZmMsdHdfc21fY18xMDQpOworCQlkZWJfaTJjKCJyZWFkOiByMTAwOiAlMDh4LCByMTA0OiAlMDh4XG4iLHIxMDAucmF3LHIxMDQucmF3KTsKKworCQkvKiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbW9yZSBieXRlLCBvdGhlcndpc2Ugd2Ugd291bGRuJ3QgYmUgaGVyZSAqLworCQlidWZbMV0gPSByMTA0LnR3X3NtX2NfMTA0LmRhdGEyX3JlZzsKKwkJaWYgKGxlbiA+IDEpIGJ1ZlsyXSA9IHIxMDQudHdfc21fY18xMDQuZGF0YTNfcmVnOworCQlpZiAobGVuID4gMikgYnVmWzNdID0gcjEwNC50d19zbV9jXzEwNC5kYXRhNF9yZWc7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF9pMmNfd3JpdGU0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3ZhbHVlIHIxMDAsIHU4ICpidWYpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgcjEwNDsKKwlpbnQgbGVuID0gcjEwMC50d19zbV9jXzEwMC50b3RhbF9ieXRlczsgLyogcmVtZW1iZXIgdG90YWxfYnl0ZXMgaXMgYnVmbGVuLTEgKi8KKwlyMTA0LnJhdyA9IDA7CisKKwkvKiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYnl0ZSwgb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGJlIGhlcmUgKi8KKwlyMTAwLnR3X3NtX2NfMTAwLmRhdGExX3JlZyA9IGJ1ZlswXTsKKworCXIxMDQudHdfc21fY18xMDQuZGF0YTJfcmVnID0gbGVuID4gMCA/IGJ1ZlsxXSA6IDA7CisJcjEwNC50d19zbV9jXzEwNC5kYXRhM19yZWcgPSBsZW4gPiAxID8gYnVmWzJdIDogMDsKKwlyMTA0LnR3X3NtX2NfMTA0LmRhdGE0X3JlZyA9IGxlbiA+IDIgPyBidWZbM10gOiAwOworCisJZGViX2kyYygid3JpdGU6IHIxMDA6ICUwOHgsIHIxMDQ6ICUwOHhcbiIscjEwMC5yYXcscjEwNC5yYXcpOworCisJLyogd3JpdGUgdGhlIGFkZGl0aW9uYWwgaTJjIGRhdGEgYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgaTJjIG9wZXJhdGlvbiAqLworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHR3X3NtX2NfMTA0LHIxMDQpOworCXJldHVybiBmbGV4Y29wX2kyY19vcGVyYXRpb24oZmMsJnIxMDApOworfQorCitpbnQgZmxleGNvcF9pMmNfcmVxdWVzdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2FjY2Vzc19vcF90IG9wLAorCQlmbGV4Y29wX2kyY19wb3J0X3QgcG9ydCwgdTggY2hpcGFkZHIsIHU4IGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCit7CisJaW50IHJldDsKKwl1MTYgYnl0ZXNfdG9fdHJhbnNmZXI7CisJZmxleGNvcF9pYmlfdmFsdWUgcjEwMDsKKworCWRlYl9pMmMoIm9wID0gJWRcbiIsb3ApOworCXIxMDAucmF3ID0gMDsKKwlyMTAwLnR3X3NtX2NfMTAwLmNoaXBhZGRyID0gY2hpcGFkZHI7CisJcjEwMC50d19zbV9jXzEwMC50d29XU19ydyA9IG9wOworCXIxMDAudHdfc21fY18xMDAudHdvV1NfcG9ydF9yZWcgPSBwb3J0OworCisJd2hpbGUgKGxlbiAhPSAwKSB7CisJCWJ5dGVzX3RvX3RyYW5zZmVyID0gbGVuID4gNCA/IDQgOiBsZW47CisKKwkJcjEwMC50d19zbV9jXzEwMC50b3RhbF9ieXRlcyA9IGJ5dGVzX3RvX3RyYW5zZmVyIC0gMTsKKwkJcjEwMC50d19zbV9jXzEwMC5iYXNlYWRkciA9IGFkZHI7CisKKwkJaWYgKG9wID09IEZDX1JFQUQpCisJCQlyZXQgPSBmbGV4Y29wX2kyY19yZWFkNChmYywgcjEwMCwgYnVmKTsKKwkJZWxzZQorCQkJcmV0ID0gZmxleGNvcF9pMmNfd3JpdGU0KGZjLHIxMDAsIGJ1Zik7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWJ1ZiAgKz0gYnl0ZXNfdG9fdHJhbnNmZXI7CisJCWFkZHIgKz0gYnl0ZXNfdG9fdHJhbnNmZXI7CisJCWxlbiAgLT0gYnl0ZXNfdG9fdHJhbnNmZXI7CisJfTsKKworCXJldHVybiAwOworfQorLyogZXhwb3J0ZWQgZm9yIFBDSSBpMmMgKi8KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9pMmNfcmVxdWVzdCk7CisKKy8qIG1hc3RlciB4ZmVyIGNhbGxiYWNrIGZvciBkZW1vZHVsYXRvciAqLworc3RhdGljIGludCBmbGV4Y29wX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZmYy0+aTJjX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkvKiByZWFkaW5nICovCisJaWYgKG51bSA9PSAyICYmCisJCW1zZ3NbMF0uZmxhZ3MgPT0gMCAmJgorCQltc2dzWzFdLmZsYWdzID09IEkyQ19NX1JEICYmCisJCW1zZ3NbMF0uYnVmICE9IE5VTEwgJiYKKwkJbXNnc1sxXS5idWYgIT0gTlVMTCkgeworCisJCXJldCA9IGZjLT5pMmNfcmVxdWVzdChmYywgRkNfUkVBRCwgRkNfSTJDX1BPUlRfREVNT0QsIG1zZ3NbMF0uYWRkciwgbXNnc1swXS5idWZbMF0sIG1zZ3NbMV0uYnVmLCBtc2dzWzFdLmxlbik7CisKKwl9IGVsc2UgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7IC8qIHdyaXRpbmcgY29tbWFuZCAqLworCQlpZiAobXNnc1tpXS5mbGFncyAhPSAwIHx8IG1zZ3NbaV0uYnVmID09IE5VTEwgfHwgbXNnc1tpXS5sZW4gPCAyKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBmYy0+aTJjX3JlcXVlc3QoZmMsIEZDX1dSSVRFLCBGQ19JMkNfUE9SVF9ERU1PRCwgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgJm1zZ3NbaV0uYnVmWzFdLCBtc2dzW2ldLmxlbiAtIDEpOworCX0KKworCWlmIChyZXQgPCAwKQorCQllcnIoImkyYyBtYXN0ZXJfeGZlciBmYWlsZWQiKTsKKwllbHNlCisJCXJldCA9IG51bTsKKworCXVwKCZmYy0+aTJjX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGZsZXhjb3BfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBmbGV4Y29wX2FsZ28gPSB7CisJLm5hbWUJCQk9ICJGbGV4Q29wIEkyQyBhbGdvcml0aG0iLAorCS5pZAkJCQk9IEkyQ19BTEdPX0JJVCwKKwkubWFzdGVyX3hmZXIJPSBmbGV4Y29wX21hc3Rlcl94ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gZmxleGNvcF9pMmNfZnVuYywKK307CisKK2ludCBmbGV4Y29wX2kyY19pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJaW50IHJldDsKKworCXNlbWFfaW5pdCgmZmMtPmkyY19zZW0sMSk7CisKKwltZW1zZXQoJmZjLT5pMmNfYWRhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOworCXN0cm5jcHkoZmMtPmkyY19hZGFwLm5hbWUsICJCMkMyIEZsZXhDb3AgZGV2aWNlIixJMkNfTkFNRV9TSVpFKTsKKworCWkyY19zZXRfYWRhcGRhdGEoJmZjLT5pMmNfYWRhcCxmYyk7CisKKwlmYy0+aTJjX2FkYXAuY2xhc3MJICAgID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisJZmMtPmkyY19hZGFwLmFsZ28gICAgICAgPSAmZmxleGNvcF9hbGdvOworCWZjLT5pMmNfYWRhcC5hbGdvX2RhdGEgID0gTlVMTDsKKwlmYy0+aTJjX2FkYXAuaWQgICAgICAgICA9IEkyQ19BTEdPX0JJVDsKKworCWlmICgocmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZmYy0+aTJjX2FkYXApKSA8IDApCisJCXJldHVybiByZXQ7CisKKwlmYy0+aW5pdF9zdGF0ZSB8PSBGQ19TVEFURV9JMkNfSU5JVDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmbGV4Y29wX2kyY19leGl0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJaWYgKGZjLT5pbml0X3N0YXRlICYgRkNfU1RBVEVfSTJDX0lOSVQpCisJCWkyY19kZWxfYWRhcHRlcigmZmMtPmkyY19hZGFwKTsKKworCWZjLT5pbml0X3N0YXRlICY9IH5GQ19TVEFURV9JMkNfSU5JVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1taXNjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTA2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtbWlzYy5jIC0gbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMuCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSAiZmxleGNvcC5oIgorCit2b2lkIGZsZXhjb3BfZGV0ZXJtaW5lX3JldmlzaW9uKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsbWlzY18yMDQpOworCisJc3dpdGNoICh2Lm1pc2NfMjA0LlJldl9OX3NpZ19yZXZpc2lvbl9oaSkgeworCQljYXNlIDB4MjoKKwkJCWRlYl9pbmZvKCJmb3VuZCBhIEZsZXhDb3BJSS5cbiIpOworCQkJZmMtPnJldiA9IEZMRVhDT1BfSUk7CisJCQlicmVhazsKKwkJY2FzZSAweDM6CisJCQlkZWJfaW5mbygiZm91bmQgYSBGbGV4Q29wSUliLlxuIik7CisJCQlmYy0+cmV2ID0gRkxFWENPUF9JSUI7CisJCQlicmVhazsKKwkJY2FzZSAweDA6CisJCQlkZWJfaW5mbygiZm91bmQgYSBGbGV4Q29wSUlJLlxuIik7CisJCQlmYy0+cmV2ID0gRkxFWENPUF9JSUk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigidW5rb3duIEZsZXhDb3AgUmV2aXNpb246ICV4LiBQbGVhc2UgcmVwb3J0IHRoZSBsaW51eC1kdmJAbGludXh0di5vcmcuIix2Lm1pc2NfMjA0LlJldl9OX3NpZ19yZXZpc2lvbl9oaSk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoKGZjLT5oYXNfMzJfaHdfcGlkX2ZpbHRlciA9IHYubWlzY18yMDQuUmV2X05fc2lnX2NhcHMpKQorCQlkZWJfaW5mbygidGhpcyBGbGV4Q29wIGhhcyB0aGUgYWRkaXRpb25hbCAzMiBoYXJkd2FyZSBwaWQgZmlsdGVyLlxuIik7CisJZWxzZQorCQlkZWJfaW5mbygidGhpcyBGbGV4Q29wIGhhcyBvbmx5IHRoZSA2IGJhc2ljIG1haW4gaGFyZHdhcmUgcGlkIGZpbHRlci5cbiIpOworCS8qIGJ1cyBwYXJ0cyBoYXZlIHRvIGRlY2lkZSBpZiBodyBwaWQgZmlsdGVyaW5nIGlzIHVzZWQgb3Igbm90LiAqLworfQorCitjb25zdCBjaGFyICpmbGV4Y29wX3JldmlzaW9uX25hbWVzW10gPSB7CisJIlVua293biBjaGlwIiwKKwkiRmxleENvcElJIiwKKwkiRmxleENvcElJYiIsCisJIkZsZXhDb3BJSUkiLAorfTsKKworY29uc3QgY2hhciAqZmxleGNvcF9kZXZpY2VfbmFtZXNbXSA9IHsKKwkiVW5rb3duIGRldmljZSIsCisJIkFpclN0YXIgMiBEVkItVCIsCisJIkFpclN0YXIgMiBBVFNDIiwKKwkiU2t5U3RhciAyIERWQi1TIiwKKwkiU2t5U3RhciAyIERWQi1TIChvbGQgdmVyc2lvbikiLAorCSJDYWJsZVN0YXIgMiBEVkItQyIsCit9OworCitjb25zdCBjaGFyICpmbGV4Y29wX2J1c19uYW1lc1tdID0geworCSJVU0IiLAorCSJQQ0kiLAorfTsKKwordm9pZCBmbGV4Y29wX2RldmljZV9uYW1lKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsY29uc3QgY2hhciAqcHJlZml4LGNvbnN0CisJCWNoYXIgKnN1ZmZpeCkKK3sKKwlpbmZvKCIlcyAnJXMnIGF0IHRoZSAnJXMnIGJ1cyBjb250cm9sbGVkIGJ5IGEgJyVzJyAlcyIscHJlZml4LAorCQkJZmxleGNvcF9kZXZpY2VfbmFtZXNbZmMtPmRldl90eXBlXSxmbGV4Y29wX2J1c19uYW1lc1tmYy0+YnVzX3R5cGVdLAorCQkJZmxleGNvcF9yZXZpc2lvbl9uYW1lc1tmYy0+cmV2XSxzdWZmaXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzE3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtcGNpLmMgLSBjb3ZlcnMgdGhlIFBDSSBwYXJ0IGluY2x1ZGluZyBETUEgdHJhbnNmZXJzLgorICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisjZGVmaW5lIEZDX0xPR19QUkVGSVggImZsZXhjb3AtcGNpIgorI2luY2x1ZGUgImZsZXhjb3AtY29tbW9uLmgiCisKK3N0YXRpYyBpbnQgZW5hYmxlX3BpZF9maWx0ZXJpbmcgPSAxOworbW9kdWxlX3BhcmFtKGVuYWJsZV9waWRfZmlsdGVyaW5nLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfcGlkX2ZpbHRlcmluZywgImVuYWJsZSBoYXJkd2FyZSBwaWQgZmlsdGVyaW5nOiBzdXBwb3J0ZWQgdmFsdWVzOiAwIChmdWxsdHMpLCAxIik7CisKKyNpZmRlZiBDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9ERUJVRworI2RlZmluZSBkcHJpbnRrKGxldmVsLGFyZ3MuLi4pIFwKKwlkbyB7IGlmICgoZGVidWcgJiBsZXZlbCkpIHByaW50ayhhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCU1RBVFVTICIiCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGxldmVsLGFyZ3MuLi4pCisjZGVmaW5lIERFQlNUQVRVUyAiIChkZWJ1Z2dpbmcgaXMgbm90IGVuYWJsZWQpIgorI2VuZGlmCisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgIGRwcmludGsoMHgwMSxhcmdzKQorI2RlZmluZSBkZWJfcmVnKGFyZ3MuLi4pICAgZHByaW50aygweDAyLGFyZ3MpCisjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKDB4MDQsYXJncykKKyNkZWZpbmUgZGViX2lycShhcmdzLi4uKSAgIGRwcmludGsoMHgwOCxhcmdzKQorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWcgbGV2ZWwgKDE9aW5mbywyPXJlZ3MsND1UUyw4PWlycWRtYSAofC1hYmxlKSkuIiBERUJTVEFUVVMpOworCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjEiCisjZGVmaW5lIERSSVZFUl9OQU1FICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgRGlnaXRhbCBUViBQQ0kgRHJpdmVyIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iCisKK3N0cnVjdCBmbGV4Y29wX3BjaSB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKyNkZWZpbmUgRkNfUENJX0lOSVQgICAgIDB4MDEKKyNkZWZpbmUgRkNfUENJX0RNQV9JTklUIDB4MDIKKwlpbnQgaW5pdF9zdGF0ZTsKKworCXZvaWQgX19pb21lbSAqaW9fbWVtOworCXUzMiBpcnE7CisvKiBidWZmZXJzaXplIChhdCBsZWFzdCBmb3IgRE1BMSwgbmVlZCB0byBiZSAlIDE4OCA9PSAwLAorICogdGhpcyBsb2dpYyBpcyByZXF1aXJlZCAqLworI2RlZmluZSBGQ19ERUZBVUxUX0RNQTFfQlVGU0laRSAoMTI4MCAqIDE4OCkKKyNkZWZpbmUgRkNfREVGQVVMVF9ETUEyX0JVRlNJWkUgKDEwICogMTg4KQorCXN0cnVjdCBmbGV4Y29wX2RtYSBkbWFbMl07CisKKwlpbnQgYWN0aXZlX2RtYTFfYWRkcjsgLyogMCA9IGFkZHIwIG9mIGRtYTE7IDEgPSBhZGRyMSBvZiBkbWExICovCisJdTMyIGxhc3RfZG1hMV9jdXJfcG9zOyAvKiBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciBsYXN0IHRpbWUgdGhlIHRpbWVyL3BhY2tldCBpcnEgb2NjdXJlZCAqLworCWludCBjb3VudDsKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjX2RldjsKK307CisKK3N0YXRpYyBpbnQgbGFzdHdyZWcsbGFzdHd2YWwsbGFzdHJyZWcsbGFzdHJ2YWw7CisKK3N0YXRpYyBmbGV4Y29wX2liaV92YWx1ZSBmbGV4Y29wX3BjaV9yZWFkX2liaV9yZWcgKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3JlZ2lzdGVyIHIpCit7CisJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPSBmYy0+YnVzX3NwZWNpZmljOworCWZsZXhjb3BfaWJpX3ZhbHVlIHY7CisJdi5yYXcgPSByZWFkbChmY19wY2ktPmlvX21lbSArIHIpOworCisJaWYgKGxhc3RycmVnICE9IHIgfHwgbGFzdHJ2YWwgIT0gdi5yYXcpIHsKKwkJbGFzdHJyZWcgPSByOyBsYXN0cnZhbCA9IHYucmF3OworCQlkZWJfcmVnKCJuZXcgcmQ6ICUzeDogJTA4eFxuIixyLHYucmF3KTsKKwl9CisKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3BjaV93cml0ZV9pYmlfcmVnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3JlZ2lzdGVyIHIsIGZsZXhjb3BfaWJpX3ZhbHVlIHYpCit7CisJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPSBmYy0+YnVzX3NwZWNpZmljOworCisJaWYgKGxhc3R3cmVnICE9IHIgfHwgbGFzdHd2YWwgIT0gdi5yYXcpIHsKKwkJbGFzdHdyZWcgPSByOyBsYXN0d3ZhbCA9IHYucmF3OworCQlkZWJfcmVnKCJuZXcgd3I6ICUzeDogJTA4eFxuIixyLHYucmF3KTsKKwl9CisKKwl3cml0ZWwodi5yYXcsIGZjX3BjaS0+aW9fbWVtICsgcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdoZW4gUElEIGZpbHRlcmluZyBpcyB0dXJuZWQgb24sIHdlIHVzZSB0aGUgdGltZXIgSVJRLCBiZWNhdXNlIHNtYWxsIGFtb3VudHMKKyAqIG9mIGRhdGEgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIHVzZXIgc3BhY2UgaW5zdGFudGx5IGFzIHdlbGwuIFdoZW4gUElECisgKiBmaWx0ZXJpbmcgaXMgdHVybmVkIG9mZiwgd2UgdXNlIHRoZSBwYWdlLWNoYW5nZS1JUlEgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBmbGV4Y29wX3BjaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRldl9pZDsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmNfcGNpLT5mY19kZXY7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsaXJxXzIwYyk7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2tfaXJxKCZmY19wY2ktPmlycV9sb2NrKTsKKworCWlmICh2LmlycV8yMGMuRE1BMV9JUlFfU3RhdHVzID09IDEpIHsKKwkJaWYgKGZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9PSAwKQorCQkJZmxleGNvcF9wYXNzX2RteF9wYWNrZXRzKGZjX3BjaS0+ZmNfZGV2LGZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCxmY19wY2ktPmRtYVswXS5zaXplIC8gMTg4KTsKKwkJZWxzZQorCQkJZmxleGNvcF9wYXNzX2RteF9wYWNrZXRzKGZjX3BjaS0+ZmNfZGV2LGZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMSxmY19wY2ktPmRtYVswXS5zaXplIC8gMTg4KTsKKworCQlkZWJfaXJxKCJwYWdlIGNoYW5nZSB0byBwYWdlOiAlZFxuIiwhZmNfcGNpLT5hY3RpdmVfZG1hMV9hZGRyKTsKKwkJZmNfcGNpLT5hY3RpdmVfZG1hMV9hZGRyID0gIWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkcjsKKwl9IGVsc2UgaWYgKHYuaXJxXzIwYy5ETUExX1RpbWVyX1N0YXR1cyA9PSAxKSB7CisJCS8qIGZvciB0aGUgdGltZXIgSVJRIHdlIG9ubHkgY2FuIHVzZSBidWZmZXIgZG14IGZlZWRpbmcsIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZQorCQkgKiBjb21wbGV0ZSBUUyBwYWNrZXRzIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBETUEgbWVtb3J5ICovCisJCWRtYV9hZGRyX3QgY3VyX2FkZHIgPQorCQkJZmMtPnJlYWRfaWJpX3JlZyhmYyxkbWExXzAwOCkuZG1hXzB4OC5kbWFfY3VyX2FkZHIgPDwgMjsKKwkJdTMyIGN1cl9wb3MgPSBjdXJfYWRkciAtIGZjX3BjaS0+ZG1hWzBdLmRtYV9hZGRyMDsKKworCQlkZWJfaXJxKCJpcnE6ICUwOHggY3VyX2FkZHI6ICUwOHg6IGN1cl9wb3M6ICUwOHgsIGxhc3RfY3VyX3BvczogJTA4eCAiLAorCQkJCXYucmF3LGN1cl9hZGRyLGN1cl9wb3MsZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisKKwkJLyogYnVmZmVyIGVuZCB3YXMgcmVhY2hlZCwgcmVzdGFydGVkIGZyb20gdGhlIGJlZ2lubmluZworCQkgKiBwYXNzIHRoZSBkYXRhIGZyb20gbGFzdF9jdXJfcG9zIHRvIHRoZSBidWZmZXIgZW5kIHRvIHRoZSBkZW11eAorCQkgKi8KKwkJaWYgKGN1cl9wb3MgPCBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKSB7CisJCQlkZWJfaXJxKCIgZW5kIHdhcyByZWFjaGVkOiBwYXNzaW5nICVkIGJ5dGVzICIsKGZjX3BjaS0+ZG1hWzBdLnNpemUqMiAtIDEpIC0gZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisJCQlmbGV4Y29wX3Bhc3NfZG14X2RhdGEoZmNfcGNpLT5mY19kZXYsCisJCQkJCWZjX3BjaS0+ZG1hWzBdLmNwdV9hZGRyMCArIGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MsCisJCQkJCShmY19wY2ktPmRtYVswXS5zaXplKjIpIC0gZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisJCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gMDsKKwkJCWZjX3BjaS0+Y291bnQgPSAwOworCQl9CisKKwkJaWYgKGN1cl9wb3MgPiBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKSB7CisJCQlkZWJfaXJxKCIgcGFzc2luZyAlZCBieXRlcyAiLGN1cl9wb3MgLSBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zKTsKKwkJCWZsZXhjb3BfcGFzc19kbXhfZGF0YShmY19wY2ktPmZjX2RldiwKKwkJCQkJZmNfcGNpLT5kbWFbMF0uY3B1X2FkZHIwICsgZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcywKKwkJCQkJY3VyX3BvcyAtIGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MpOworCQl9CisJCWRlYl9pcnEoIlxuIik7CisKKwkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IGN1cl9wb3M7CisJfSBlbHNlCisJCXJldCA9IElSUV9OT05FOworCisJc3Bpbl91bmxvY2tfaXJxKCZmY19wY2ktPmlycV9sb2NrKTsKKworLyogcGFja2V0IGNvdW50IHdvdWxkIGJlIGlkZWFsIGZvciBodyBmaWx0ZXJpbmcsIGJ1dCBpdCBpc24ndCB3b3JraW5nLiBFaXRoZXIKKyAqIHRoZSBkYXRhIGJvb2sgaXMgd3JvbmcsIG9yIEknbSB1bmFibGUgdG8gcmVhZCBpdCBjb3JyZWN0bHkgKi8KKworLyoJaWYgKHYuaXJxXzIwYy5ETUExX1NpemVfSVJRX1N0YXR1cyA9PSAxKSB7IHBhY2tldCBjb3VudGVyICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsZXhjb3BfcGNpX3N0cmVhbV9jb250cm9sKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGZjLT5idXNfc3BlY2lmaWM7CisJaWYgKG9ub2ZmKSB7CisJCWZsZXhjb3BfZG1hX2NvbmZpZyhmYywmZmNfcGNpLT5kbWFbMF0sRkNfRE1BXzEsRkNfRE1BX1NVQkFERFJfMCB8IEZDX0RNQV9TVUJBRERSXzEpOworCQlmbGV4Y29wX2RtYV9jb25maWcoZmMsJmZjX3BjaS0+ZG1hWzFdLEZDX0RNQV8yLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xKTsKKwkJZmxleGNvcF9kbWFfY29uZmlnX3RpbWVyKGZjLEZDX0RNQV8xLDEpOworCisJCWlmIChmY19wY2ktPmZjX2Rldi0+cGlkX2ZpbHRlcmluZykgeworCQkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IDA7CisJCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwxKTsKKwkJfSBlbHNlIHsKKwkJCWZjX3BjaS0+YWN0aXZlX2RtYTFfYWRkciA9IDA7CisJCQlmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKGZjLEZDX0RNQV8xLDEpOworCQl9CisKKy8qCQlmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KGZjLEZDX0RNQV8xLDB4YzApOworCQlmbGV4Y29wX2RtYV9jb250cm9sX3BhY2tldF9pcnEoZmMsRkNfRE1BXzEsMSk7ICovCisKKwkJZGViX2lycSgiaXJxcyBlbmFibGVkXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoZmNfcGNpLT5mY19kZXYtPnBpZF9maWx0ZXJpbmcpCisJCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwwKTsKKwkJZWxzZQorCQkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwwKTsKKworLy8JCWZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycShmYyxGQ19ETUFfMSwwKTsKKwkJZGViX2lycSgiaXJxcyBkaXNhYmxlZFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF9wY2lfZG1hX2luaXQoc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kpCit7CisJaW50IHJldDsKKwlpZiAoKHJldCA9IGZsZXhjb3BfZG1hX2FsbG9jYXRlKGZjX3BjaS0+cGRldiwmZmNfcGNpLT5kbWFbMF0sRkNfREVGQVVMVF9ETUExX0JVRlNJWkUpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChyZXQgPSBmbGV4Y29wX2RtYV9hbGxvY2F0ZShmY19wY2ktPnBkZXYsJmZjX3BjaS0+ZG1hWzFdLEZDX0RFRkFVTFRfRE1BMl9CVUZTSVpFKSkgIT0gMCkKKwkJZ290byBkbWExX2ZyZWU7CisKKwlmbGV4Y29wX3NyYW1fc2V0X2Rlc3QoZmNfcGNpLT5mY19kZXYsRkNfU1JBTV9ERVNUX01FRElBIHwgRkNfU1JBTV9ERVNUX05FVCwgRkNfU1JBTV9ERVNUX1RBUkdFVF9ETUExKTsKKwlmbGV4Y29wX3NyYW1fc2V0X2Rlc3QoZmNfcGNpLT5mY19kZXYsRkNfU1JBTV9ERVNUX0NBTyAgIHwgRkNfU1JBTV9ERVNUX0NBSSwgRkNfU1JBTV9ERVNUX1RBUkdFVF9ETUEyKTsKKworCWZjX3BjaS0+aW5pdF9zdGF0ZSB8PSBGQ19QQ0lfRE1BX0lOSVQ7CisJZ290byBzdWNjZXNzOworZG1hMV9mcmVlOgorCWZsZXhjb3BfZG1hX2ZyZWUoJmZjX3BjaS0+ZG1hWzBdKTsKKworc3VjY2VzczoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmbGV4Y29wX3BjaV9kbWFfZXhpdChzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSkKK3sKKwlpZiAoZmNfcGNpLT5pbml0X3N0YXRlICYgRkNfUENJX0RNQV9JTklUKSB7CisJCWZsZXhjb3BfZG1hX2ZyZWUoJmZjX3BjaS0+ZG1hWzBdKTsKKwkJZmxleGNvcF9kbWFfZnJlZSgmZmNfcGNpLT5kbWFbMV0pOworCX0KKwlmY19wY2ktPmluaXRfc3RhdGUgJj0gfkZDX1BDSV9ETUFfSU5JVDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3BjaV9pbml0KHN0cnVjdCBmbGV4Y29wX3BjaSAqZmNfcGNpKQoreworCWludCByZXQ7CisJdTggY2FyZF9yZXY7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShmY19wY2ktPnBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNhcmRfcmV2KTsKKwlpbmZvKCJjYXJkIHJldmlzaW9uICV4IiwgY2FyZF9yZXYpOworCisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShmY19wY2ktPnBkZXYpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcGNpX3NldF9tYXN0ZXIoZmNfcGNpLT5wZGV2KTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJLy8gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDZjLCAweDgwMDApOworCisJaWYgKChyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGZjX3BjaS0+cGRldiwgRFJJVkVSX05BTUUpKSAhPSAwKQorCQlnb3RvIGVycl9wY2lfZGlzYWJsZV9kZXZpY2U7CisKKwlmY19wY2ktPmlvX21lbSA9IHBjaV9pb21hcChmY19wY2ktPnBkZXYsIDAsIDB4ODAwKTsKKworCWlmICghZmNfcGNpLT5pb19tZW0pIHsKKwkJZXJyKCJjYW5ub3QgbWFwIGlvIG1lbW9yeVxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKGZjX3BjaS0+cGRldiwgZmNfcGNpKTsKKworCWlmICgocmV0ID0gcmVxdWVzdF9pcnEoZmNfcGNpLT5wZGV2LT5pcnEsIGZsZXhjb3BfcGNpX2lycSwKKwkJCQkJU0FfU0hJUlEsIERSSVZFUl9OQU1FLCBmY19wY2kpKSAhPSAwKQorCQlnb3RvIGVycl9wY2lfaW91bm1hcDsKKworCXNwaW5fbG9ja19pbml0KCZmY19wY2ktPmlycV9sb2NrKTsKKworCWZjX3BjaS0+aW5pdF9zdGF0ZSB8PSBGQ19QQ0lfSU5JVDsKKwlnb3RvIHN1Y2Nlc3M7CisKK2Vycl9wY2lfaW91bm1hcDoKKwlwY2lfaW91bm1hcChmY19wY2ktPnBkZXYsIGZjX3BjaS0+aW9fbWVtKTsKKwlwY2lfc2V0X2RydmRhdGEoZmNfcGNpLT5wZGV2LCBOVUxMKTsKK2Vycl9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZmNfcGNpLT5wZGV2KTsKK2Vycl9wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGZjX3BjaS0+cGRldik7CisKK3N1Y2Nlc3M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmxleGNvcF9wY2lfZXhpdChzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSkKK3sKKwlpZiAoZmNfcGNpLT5pbml0X3N0YXRlICYgRkNfUENJX0lOSVQpIHsKKwkJZnJlZV9pcnEoZmNfcGNpLT5wZGV2LT5pcnEsIGZjX3BjaSk7CisJCXBjaV9pb3VubWFwKGZjX3BjaS0+cGRldiwgZmNfcGNpLT5pb19tZW0pOworCQlwY2lfc2V0X2RydmRhdGEoZmNfcGNpLT5wZGV2LCBOVUxMKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhmY19wY2ktPnBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UoZmNfcGNpLT5wZGV2KTsKKwl9CisJZmNfcGNpLT5pbml0X3N0YXRlICY9IH5GQ19QQ0lfSU5JVDsKK30KKworCitzdGF0aWMgaW50IGZsZXhjb3BfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmM7CisJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2k7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlpZiAoKGZjID0gZmxleGNvcF9kZXZpY2Vfa21hbGxvYyhzaXplb2Yoc3RydWN0IGZsZXhjb3BfcGNpKSkpID09IE5VTEwpIHsKKwkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisvKiBnZW5lcmFsIGZsZXhjb3AgaW5pdCAqLworCWZjX3BjaSA9IGZjLT5idXNfc3BlY2lmaWM7CisJZmNfcGNpLT5mY19kZXYgPSBmYzsKKworCWZjLT5yZWFkX2liaV9yZWcgPSBmbGV4Y29wX3BjaV9yZWFkX2liaV9yZWc7CisJZmMtPndyaXRlX2liaV9yZWcgPSBmbGV4Y29wX3BjaV93cml0ZV9pYmlfcmVnOworCWZjLT5pMmNfcmVxdWVzdCA9IGZsZXhjb3BfaTJjX3JlcXVlc3Q7CisJZmMtPmdldF9tYWNfYWRkciA9IGZsZXhjb3BfZWVwcm9tX2NoZWNrX21hY19hZGRyOworCisJZmMtPnN0cmVhbV9jb250cm9sID0gZmxleGNvcF9wY2lfc3RyZWFtX2NvbnRyb2w7CisKKwlpZiAoZW5hYmxlX3BpZF9maWx0ZXJpbmcpCisJCWluZm8oIndpbGwgdXNlIHRoZSBIVyBQSUQgZmlsdGVyLiIpOworCWVsc2UKKwkJaW5mbygid2lsbCBwYXNzIHRoZSBjb21wbGV0ZSBUUyB0byB0aGUgZGVtdXhlci4iKTsKKworCWZjLT5waWRfZmlsdGVyaW5nID0gZW5hYmxlX3BpZF9maWx0ZXJpbmc7CisJZmMtPmJ1c190eXBlID0gRkNfUENJOworCisJZmMtPmRldiA9ICZwZGV2LT5kZXY7CisJZmMtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKy8qIGJ1cyBzcGVjaWZpYyBwYXJ0ICovCisJZmNfcGNpLT5wZGV2ID0gcGRldjsKKwlpZiAoKHJldCA9IGZsZXhjb3BfcGNpX2luaXQoZmNfcGNpKSkgIT0gMCkKKwkJZ290byBlcnJfa2ZyZWU7CisKKy8qIGluaXQgZmxleGNvcCAqLworCWlmICgocmV0ID0gZmxleGNvcF9kZXZpY2VfaW5pdGlhbGl6ZShmYykpICE9IDApCisJCWdvdG8gZXJyX3BjaV9leGl0OworCisvKiBpbml0IGRtYSAqLworCWlmICgocmV0ID0gZmxleGNvcF9wY2lfZG1hX2luaXQoZmNfcGNpKSkgIT0gMCkKKwkJZ290byBlcnJfZmNfZXhpdDsKKworCWdvdG8gc3VjY2VzczsKK2Vycl9mY19leGl0OgorCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOworZXJyX3BjaV9leGl0OgorCWZsZXhjb3BfcGNpX2V4aXQoZmNfcGNpKTsKK2Vycl9rZnJlZToKKwlmbGV4Y29wX2RldmljZV9rZnJlZShmYyk7CitzdWNjZXNzOgorCXJldHVybiByZXQ7Cit9CisKKy8qIGluIHRoZW9yeSBldmVyeSBfZXhpdCBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGV4YWN0bHkgdHdvIHRpbWVzLAorICogaGVyZSBhbmQgaW4gdGhlIGJhaWwtb3V0LXBhcnQgb2YgdGhlIF9pbml0LWZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZsZXhjb3BfcGNpX2RtYV9leGl0KGZjX3BjaSk7CisJZmxleGNvcF9kZXZpY2VfZXhpdChmY19wY2ktPmZjX2Rldik7CisJZmxleGNvcF9wY2lfZXhpdChmY19wY2kpOworCWZsZXhjb3BfZGV2aWNlX2tmcmVlKGZjX3BjaS0+ZmNfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZsZXhjb3BfcGNpX3RibFtdID0geworCXsgUENJX0RFVklDRSgweDEzZDAsIDB4MjEwMykgfSwKKy8qCXsgUENJX0RFVklDRSgweDEzZDAsIDB4MjIwMCkgfSwgUENJIEZsZXhDb3BJSUkgPyAqLworCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBmbGV4Y29wX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZmxleGNvcF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gIlRlY2huaXNhdC9CMkMyIEZsZXhDb3AgSUkvSUliL0lJSSBQQ0kiLAorCS5pZF90YWJsZSA9IGZsZXhjb3BfcGNpX3RibCwKKwkucHJvYmUgPSBmbGV4Y29wX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gZmxleGNvcF9wY2lfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmxleGNvcF9wY2lfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZmxleGNvcF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZsZXhjb3BfcGNpX21vZHVsZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZmbGV4Y29wX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChmbGV4Y29wX3BjaV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChmbGV4Y29wX3BjaV9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTMxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmgKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3AtcmVnLmggLSByZWdpc3RlciBhYnN0cmFjdGlvbiBmb3IgRmxleENvcElJLCBGbGV4Q29wSUliIGFuZCBGbGV4Q29wSUlJCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisjaWZuZGVmIF9fRkxFWENPUF9SRUdfSF9fCisjZGVmaW5lIF9fRkxFWENPUF9SRUdfSF9fCisKKwordHlwZWRlZiBlbnVtIHsKKwlGTEVYQ09QX1VOSyA9IDAsCisJRkxFWENPUF9JSSwKKwlGTEVYQ09QX0lJQiwKKwlGTEVYQ09QX0lJSSwKK30gZmxleGNvcF9yZXZpc2lvbl90OworCitleHRlcm4gY29uc3QgY2hhciAqZmxleGNvcF9yZXZpc2lvbl9uYW1lc1tdOworCit0eXBlZGVmIGVudW0geworCUZDX1VOSyA9IDAsCisJRkNfQUlSX0RWQiwKKwlGQ19BSVJfQVRTQywKKwlGQ19TS1ksCisJRkNfU0tZX09MRCwKKwlGQ19DQUJMRSwKK30gZmxleGNvcF9kZXZpY2VfdHlwZV90OworCit0eXBlZGVmIGVudW0geworCUZDX1VTQiA9IDAsCisJRkNfUENJLAorfSBmbGV4Y29wX2J1c190OworCitleHRlcm4gY29uc3QgY2hhciAqZmxleGNvcF9kZXZpY2VfbmFtZXNbXTsKKworLyogRmxleENvcCBJQkkgUmVnaXN0ZXJzICovCisKKy8qIGZsZXhjb3BfaWJpX3JlZyAtIGEgaHVnZSB1bmlvbiByZXByZXNlbnRpbmcgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiB1bmlvbiB7CisJdTMyIHJhdzsKKworLyogRE1BIDB4MDAwIHRvIDB4MDFjCisgKiBETUExIDB4MDAwIHRvIDB4MDBjCisgKiBETUEyIDB4MDEwIHRvIDB4MDFjCisgKi8KKwlzdHJ1Y3QgeworCQl1MzIgZG1hXzBzdGFydCAgICAgICAgOiAxOyAgIC8qIHNldDogZGF0YSB3aWxsIGJlIGRlbGl2ZXJlZCB0byBkbWExX2FkZHJlc3MwICovCisgICAgICAgIHUzMiBkbWFfME5vX3VwZGF0ZSAgICA6IDE7ICAgLyogc2V0OiBkbWExX2N1cl9hZGRyZXNzIHdpbGwgYmUgdXBkYXRlZCwgdW5zZXQ6IG5vIHVwZGF0ZSAqLworICAgICAgICB1MzIgZG1hX2FkZHJlc3MwICAgICAgOjMwOyAgIC8qIHBoeXNpY2FsL3ZpcnR1YWwgaG9zdCBtZW1vcnkgYWRkcmVzczAgRE1BICovCisJfSBkbWFfMHgwOworCisJc3RydWN0IHsKKwkJdTMyIERNQV9tYXhwYWNrZXRzICAgIDogODsgICAvKiAocmVtYXBwZWQpIFBDSSBETUExIFBhY2tldCBDb3VudCBJbnRlcnJ1cHQuIFRoaXMgdmFyaWFibGUKKwkJCQkJCQkJCQlpcyBhYmxlIHRvIGJlIHJlYWQgYW5kIHdyaXR0ZW4gd2hpbGUgYml0KDEpIG9mIHJlZ2lzdGVyCisJCQkJCQkJCQkJMHgwMGMgKHJlbWFwX2VuYWJsZSkgaXMgc2V0LiBUaGlzIHZhcmlhYmxlIHJlcHJlc2VudHMKKwkJCQkJCQkJCQl0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBQQ0kKKwkJCQkJCQkJCQlob3N0IHVzaW5nIFBDSSBETUExIGJlZm9yZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIFBDSSBpcworCQkJCQkJCQkJCWFzc2VydGVkLiBUaGlzIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIGVuYWJsZWQgdXNpbmcgYml0KDIwKQorCQkJCQkJCQkJCW9mIHJlZ2lzdGVyIDB4MjA4LiBOPTAgZGlzYWJsZXMgdGhlIElSUS4gKi8KKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgIDoyNDsgICAvKiBzaXplIG9mIG1lbW9yeSBidWZmZXIgaW4gRFdPUkRzIChieXRlc2l6ZSAvIDQpIGZvciBETUEgKi8KKwl9IGRtYV8weDRfcmVtYXA7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hMXRpbWVyICAgICAgICAgOiA3OyAgIC8qIHJlYWRpbmcgUENJIERNQTEgdGltZXIgLi4uIHdoZW4gcmVtYXBfZW5hYmxlIGlzIDAgKi8KKwkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgIDoyNDsKKwl9IGRtYV8weDRfcmVhZDsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWF0aW1lciAgICAgICAgICA6IDc7ICAgLyogd3JpdGluZyBQQ0kgRE1BMSB0aW1lciAuLi4gd2hlbiByZW1hcF9lbmFibGUgaXMgMCAqLworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgOjI0OworCX0gZG1hXzB4NF93cml0ZTsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDI7CisJCXUzMiBkbWFfY3VyX2FkZHIgICAgICA6MzA7ICAgLyogY3VycmVudCBwaHlzaWNhbCBob3N0IG1lbW9yeSBhZGRyZXNzIHBvaW50ZXIgZm9yIERNQSAqLworCX0gZG1hXzB4ODsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfMXN0YXJ0ICAgICAgICA6IDE7ICAgLyogc2V0OiBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIHRvIGRtYV9hZGRyZXNzMSwgd2hlbiBkbWFfYWRkcmVzczAgaXMgZnVsbCAqLworCQl1MzIgcmVtYXBfZW5hYmxlICAgICAgOiAxOyAgIC8qIHJlbWFwIGVuYWJsZSBmb3IgMHgweDQoNzowKSAqLworCQl1MzIgZG1hX2FkZHJlc3MxICAgICAgOjMwOyAgIC8qIFBoeXNpY2FsL3ZpcnR1YWwgYWRkcmVzcyAxIG9uIERNQSAqLworCX0gZG1hXzB4YzsKKworLyogVHdvLXdpcmUgU2VyaWFsIE1hc3RlciBhbmQgQ2xvY2sgMHgxMDAtMHgxMTAgKi8KKwlzdHJ1Y3QgeworLy8JCXUzMiBzbGF2ZV90cmFuc21pdHRlciA6IDE7ICAgLyogPz8/Ki8KKwkJdTMyIGNoaXBhZGRyICAgICAgICAgIDogNzsgICAvKiB0d28tbGluZSBzZXJpYWwgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHNsYXZlICovCisJCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDE7CisJCXUzMiBiYXNlYWRkciAgICAgICAgICA6IDg7ICAgLyogYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCisJCXUzMiBkYXRhMV9yZWcgICAgICAgICA6IDg7ICAgLyogZmlyc3QgYnl0ZSBpbiB0d28tbGluZSBzZXJpYWwgcmVhZC93cml0ZSBvcGVyYXRpb24gKi8KKwkJdTMyIHdvcmtpbmdfc3RhcnQgICAgIDogMTsgIC8qIHdoZW4gZG9pbmcgYSB3cml0ZSBvcGVyYXRpb24gdGhpcyBpbmRpY2F0b3IgaXMgMCB3aGVuIHJlYWR5CisJCQkJCQkJCQkgICogc2V0IHRvIDEgd2hlbiBkb2luZyBhIHdyaXRlIG9wZXJhdGlvbiAqLworCQl1MzIgdHdvV1NfcncgICAgICAgICAgOiAxOyAgIC8qIHJlYWQvd3JpdGUgaW5kaWNhdG9yICgxID0gcmVhZCwgMCB3cml0ZSkgKi8KKwkJdTMyIHRvdGFsX2J5dGVzICAgICAgIDogMjsgICAvKiBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBlYWNoIHR3by1saW5lIHNlcmlhbCB0cmFuc2FjdGlvbiAoMCA9IDEgYnl0ZSwgMTEgPSA0Ynl0ZSkqLworCQl1MzIgdHdvV1NfcG9ydF9yZWcgICAgOiAyOyAgIC8qIHBvcnQgc2VsZWN0aW9uOiAwMSAtIEZyb250IEVuZC9EZW1vZCwgMTAgLSBFRVBST00sIDExIC0gVHVuZXIgKi8KKwkJdTMyIG5vX2Jhc2VfYWRkcl9hY2tfZXJyb3IgOiAxOyAgIC8qIHdyaXRpbmc6IHdyaXRlLXJlcTogZnJhbWUgaXMgcHJvZHVjZWQgdy9vIGJhc2VhZGRyLCByZWFkLXJlcTogcmVhZC1jeWNsZXMgdy9vCisJCQkJCQkJCQkgICogcHJlY2VkaW5nIGFkZHJlc3MgYXNzaWdubWVudCB3cml0ZSBmcmFtZQorCQkJCQkJCQkJICAqIEFDS19FUlJPUiA9IDEgd2hlbiBubyBBQ0sgZnJvbSBzbGF2ZSBpbiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAqLworCQl1MzIgc3RfZG9uZSAgICAgICAgICAgOiAxOyAgIC8qIGluZGljYXRvciBmb3IgdHJhbnNhY3Rpb24gaXMgZG9uZSAqLworCX0gdHdfc21fY18xMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgZGF0YTJfcmVnICAgICAgICAgOiA4OyAgIC8qIDJuZCBkYXRhIGJ5dGUgKi8KKwkJdTMyIGRhdGEzX3JlZyAgICAgICAgIDogODsgICAvKiAzcmQgZGF0YSBieXRlICovCisJCXUzMiBkYXRhNF9yZWcgICAgICAgICA6IDg7ICAgLyogNHRoIGRhdGEgYnl0ZSAqLworCQl1MzIgZXhsaWNpdF9zdG9wcyAgICAgOiAxOyAgIC8qIHdoZW4gc2V0LCB0cmFuc2FjdGlvbnMgYXJlIHByb2R1Y2VkIHcvbyB0cmFpbGluZyBTVE9QIGZsYWcsIHRoZW4gc2VuZCBpc29sYXRlZCBTVE9QIGZsYWdzICovCisJCXUzMiBmb3JjZV9zdG9wICAgICAgICA6IDE7ICAgLyogaXNvbGF0ZWQgc3RvcCBmbGFnICovCisJCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwNDsKKworLyogQ2xvY2suIFRoZSByZWdpc3RlciBhbGxvd3MgdGhlIEZDSUlJIHRvIGNvbnZlcnQgYW4gaW5jb21pbmcgTWFzdGVyIGNsb2NrCisgKiAoTUNMSykgc2lnbmFsIGludG8gYSBsb3dlciBmcmVxdWVuY3kgY2xvY2sgdGhyb3VnaCB0aGUgdXNlIG9mIGEgTG93Q291bnRlcgorICogKFRMTykgYW5kIGEgSGlnaC0gQ291bnRlciAoVEhJKS4gVGhlIHRpbWUgY291bnRzIGZvciBUSEkgYW5kIFRMTyBhcmUKKyAqIG1lYXN1cmVkIGluIE1DTEs7IGVhY2ggY291bnQgcmVwcmVzZW50cyA0IE1DTEsgaW5wdXQgY2xvY2sgY3ljbGVzLgorICoKKyAqIFRoZSBkZWZhdWx0IG91dHB1dCBmb3IgcG9ydCAjMSBpcyBzZXQgZm9yIEZyb250IEVuZCBEZW1vZCBjb21tdW5pY2F0aW9uLiAoMHgxMDgpCisgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZm9yIHBvcnQgIzIgaXMgc2V0IGZvciBFRVBST00gY29tbXVuaWNhdGlvbi4gKDB4MTBjKQorICogVGhlIGRlZmF1bHQgb3V0cHV0IGZvciBwb3J0ICMzIGlzIHNldCBmb3IgVHVuZXIgY29tbXVuaWNhdGlvbi4gKDB4MTEwKQorICovCisJc3RydWN0IHsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgIDogNjsgICAvKiBUaGkgZm9yIHBvcnQgIzEgKGRlZjogMTAwMTEwYjsgMzgpICovCisJCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDI7CisJCXUzMiB0bG8xICAgICAgICAgICAgICA6IDU7ICAgLyogVGxvIGZvciBwb3J0ICMxIChkZWY6IDExMTAwYjsgMjgpICovCisJCXUzMiByZXNlcnZlZDIgICAgICAgICA6MTk7CisJfSB0d19zbV9jXzEwODsKKworCXN0cnVjdCB7CisJCXUzMiB0aGkxICAgICAgICAgICAgICA6IDY7ICAgLyogVGhpIGZvciBwb3J0ICMyIChkZWY6IDExMTAwMWI7IDU3KSAqLworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAyOworCQl1MzIgdGxvMSAgICAgICAgICAgICAgOiA1OyAgIC8qIFRsbyBmb3IgcG9ydCAjMiAoZGVmOiAxMTEwMGI7IDI4KSAqLworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOjE5OworCX0gdHdfc21fY18xMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdGhpMSAgICAgICAgICAgICAgOiA2OyAgIC8qIFRoaSBmb3IgcG9ydCAjMyAoZGVmOiAxMTEwMDFiOyA1NykgKi8KKwkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMjsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgIDogNTsgICAvKiBUbG8gZm9yIHBvcnQgIzMgKGRlZjogMTExMDBiOyAyOCkgKi8KKwkJdTMyIHJlc2VydmVkMiAgICAgICAgIDoxOTsKKwl9IHR3X3NtX2NfMTEwOworCisvKiBMTkIgU3dpdGNoIEZyZXF1ZW5jeSAweDIwMAorICogQ2xvY2sgdGhhdCBjcmVhdGVzIHRoZSBMTkIgc3dpdGNoIHRvbmUuIFRoZSBkZWZhdWx0IGlzIHNldCB0byBoYXZlIGEgZml4ZWQKKyAqIGxvdyBvdXRwdXQgKG5vdCBvc2NpbGxhdGluZykgdG8gdGhlIExOQl9DVEwgbGluZS4KKyAqLworCXN0cnVjdCB7CisJCXUzMiBMTkJfQ1RMSGlnaENvdW50X3NpZyA6MTU7IC8qIEl0IGlzIHRoZSBudW1iZXIgb2YgcHJlLXNjYWxlZCBjbG9jayBjeWNsZXMgdGhhdCB3aWxsIGJlIGxvdy4gKi8KKwkJdTMyIExOQl9DVExMb3dDb3VudF9zaWcgIDoxNTsgLyogRm9yIGV4YW1wbGUsIHRvIG9idGFpbiBhIDIyS0h6IG91dHB1dCBnaXZlbiBhIDQ1IE1oeiBNYXN0ZXIKKwkJCQkJCQkJCQlDbG9jayBzaWduYWwgKE1DTEspLCBzZXQgUHJlU2NhbGFyPTAxIGFuZCBMb3dDb3VudGVyIHZhbHVlIHRvIDB4MWZmLiAqLworCQl1MzIgTE5CX0NUTFByZXNjYWxlcl9zaWcgOiAyOyAvKiBwcmUtc2NhbGVyIGRpdmlkZXMgTUNMSzogMDAgKG5vIGRpdmlzaW9uKSwgMDEgYnkgMiwgMTAgYnkgNCwgMTEgYnkgMTIgKi8KKwl9IGxuYl9zd2l0Y2hfZnJlcV8yMDA7CisKKy8qIEFDUEksIFBlcmlwaGVyYWwgUmVzZXQsIExOQiBQb2xhcml0eQorICogQUNQSSBwb3dlciBjb25zZXJ2YXRpb24gbW9kZSwgTE5CIHBvbGFyaXR5IHNlbGVjdGlvbiAobG93IG9yIGhpZ2ggdm9sdGFnZSksCisgKiBhbmQgcGVyaXBoZXJhbCByZXNldC4KKyAqLworCXN0cnVjdCB7CisJCXUzMiBBQ1BJMV9zaWcgICAgICAgICA6IDE7ICAgLyogdHVybiBvZiB0aGUgcG93ZXIgb2YgdHVuZXIgYW5kIExOQiwgbm90IGltcGxlbWVudGVkIGluIEZDSUlJICovCisJCXUzMiBBQ1BJM19zaWcgICAgICAgICA6IDE7ICAgLyogdHVybiBvZiBwb3dlciBvZiB0aGUgY29tcGxldGUgc2F0ZWxpdGUgcmVjZWl2ZXIgYm9hcmQgKGV4Y2VwdCBGQ0lJSSkgKi8KKwkJdTMyIExOQl9MX0hfc2lnICAgICAgIDogMTsgICAvKiBsb3cgb3IgaGlnaCB2b2x0YWdlIGZvciBMTkIuICgwID0gbG93LCAxID0gaGlnaCkgKi8KKwkJdTMyIFBlcl9yZXNldF9zaWcgICAgIDogMTsgICAvKiBtaXNjLiBpbml0IHJlc2V0IChkZWZhdWx0OiAxKSwgdG8gcmVzZXQgc2V0IHRvIGxvdyBhbmQgYmFjayB0byBoaWdoICovCisJCXUzMiByZXNlcnZlZCAgICAgICAgICA6MjA7CisJCXUzMiBSZXZfTl9zaWdfcmV2aXNpb25faGkgOiA0Oy8qIDB4YyBpbiBjYXNlIG9mIEZDSUlJICovCisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQxIDogMjsKKwkJdTMyIFJldl9OX3NpZ19jYXBzICAgIDogMTsgICAvKiBpZiAxLCBGQ0lJSSBoYXMgMzIgUElELSBhbmQgTUFDLWZpbHRlcnMgYW5kIGlzIGNhcGFibGUgb2YgSVAgbXVsdGljYXN0ICovCisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQyIDogMTsKKwl9IG1pc2NfMjA0OworCisvKiBDb250cm9sIGFuZCBTdGF0dXMgMHgyMDggdG8gMHgyMWMgKi8KKy8qIEdyb3NzIGVuYWJsZSBhbmQgZGlzYWJsZSBjb250cm9sICovCisJc3RydWN0IHsKKwkJdTMyIFN0cmVhbTFfZmlsdGVyX3NpZyA6IDE7ICAvKiBTdHJlYW0xIFBJRCBmaWx0ZXJpbmcgKi8KKwkJdTMyIFN0cmVhbTJfZmlsdGVyX3NpZyA6IDE7ICAvKiBTdHJlYW0yIFBJRCBmaWx0ZXJpbmcgKi8KKwkJdTMyIFBDUl9maWx0ZXJfc2lnICAgIDogMTsgICAvKiBQQ1IgUElEIGZpbHRlciAqLworCQl1MzIgUE1UX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIFBNVCBQSUQgZmlsdGVyICovCisKKwkJdTMyIEVNTV9maWx0ZXJfc2lnICAgIDogMTsgICAvKiBFTU0gUElEIGZpbHRlciAqLworCQl1MzIgRUNNX2ZpbHRlcl9zaWcgICAgOiAxOyAgIC8qIEVDTSBQSUQgZmlsdGVyICovCisJCXUzMiBOdWxsX2ZpbHRlcl9zaWcgICA6IDE7ICAgLyogRmlsdGVycyBudWxsIHBhY2tldHMsIFBJRD0weDFmZmYuICovCisJCXUzMiBNYXNrX2ZpbHRlcl9zaWcgICA6IDE7ICAgLyogbWFzayBQSUQgZmlsdGVyICovCisKKwkJdTMyIFdBTl9FbmFibGVfc2lnICAgIDogMTsgICAvKiBXQU4gb3V0cHV0IGxpbmUgdGhyb3VnaCBWOCBtZW1vcnkgc3BhY2UgaXMgYWN0aXZhdGVkLiAqLworCQl1MzIgV0FOX0NBX0VuYWJsZV9zaWcgOiAxOyAgIC8qIG5vdCBpbiBGQ0lJSSAqLworCQl1MzIgQ0FfRW5hYmxlX3NpZyAgICAgOiAxOyAgIC8qIG5vdCBpbiBGQ0lJSSAqLworCQl1MzIgU01DX0VuYWJsZV9zaWcgICAgOiAxOyAgIC8qIENJIHN0cmVhbSBkYXRhIChDQUkpIGdvZXMgZGlyZWN0bHkgdG8gdGhlIHNtYXJ0IGNhcmQgaW50ZiAob3Bwb3NlZCBJQkkgMHg2MDAgb3IgU0MtY21kIGJ1ZikuICovCisKKwkJdTMyIFBlcl9DQV9FbmFibGVfc2lnIDogMTsgICAvKiBub3QgaW4gRkNJSUkgKi8KKwkJdTMyIE11bHRpMl9FbmFibGVfc2lnIDogMTsgICAvKiA/ICovCisJCXUzMiBNQUNfZmlsdGVyX01vZGVfc2lnIDogMTsgLyogKE1BQ19maWx0ZXJfZW5hYmxlKSBHbG9iYWxseSBlbmFibGVzIE1BQyBmaWx0ZXJzIGZvciBOZXQgUElEIGZpbHRlcmVzLiAqLworCQl1MzIgUmN2X0RhdGFfc2lnICAgICAgOiAxOyAgIC8qIFBJRCBmaWx0ZXJpbmcgbW9kdWxlIGVuYWJsZS4gV2hlbiB0aGlzIGJpdCBpcyBhIG9uZSwgdGhlIFBJRCBmaWx0ZXIgd2lsbAorCQkJCQkJCQkJCWV4YW1pbmUgYW5kIHByb2Nlc3MgcGFja2V0cyBhY2NvcmRpbmcgdG8gYWxsIG90aGVyIChpbmRpdmlkdWFsKSBQSUQKKwkJCQkJCQkJCQlmaWx0ZXJpbmcgY29udHJvbHMuIElmIGl0IGEgemVybywgbm8gcGFja2V0IHByb2Nlc3Npbmcgb2YgYW55IGtpbmQgd2lsbAorCQkJCQkJCQkJCXRha2UgcGxhY2UuIEFsbCBkYXRhIGZyb20gdGhlIHR1bmVyIHdpbGwgYmUgdGhyb3duIGF3YXkuICovCisKKwkJdTMyIERNQTFfSVJRX0VuYWJsZV9zaWcgOiAxOyAvKiBXaGVuIHNldCwgYSBEV09SRCBjb3VudGVyIGlzIGVuYWJsZWQgb24gUENJIERNQTEgdGhhdCBhc3NlcnRzIHRoZSBQQ0kKKwkJCQkJCQkJCSAgKiBpbnRlcnJ1cHQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBjb3VudCBmb3IgZmlsbGluZyB0aGUgYnVmZmVyLiAqLworCQl1MzIgRE1BMV9UaW1lcl9FbmFibGVfc2lnIDogMTsgLyogV2hlbiBzZXQsIGEgdGltZXIgaXMgZW5hYmxlZCBvbiBQQ0kgRE1BMSB0aGF0IGFzc2VydHMgdGhlIFBDSSBpbnRlcnJ1cHQKKwkJCQkJCQkJCQkJYWZ0ZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuICovCisJCXUzMiBETUEyX0lSUV9FbmFibGVfc2lnIDogMTsgICAvKiBzYW1lIGFzIERNQTFfSVJRX0VuYWJsZV9zaWcgYnV0IGZvciBETUEyICovCisJCXUzMiBETUEyX1RpbWVyX0VuYWJsZV9zaWcgOiAxOyAgIC8qIHNhbWUgYXMgRE1BMV9UaW1lcl9FbmFibGVfc2lnIGJ1dCBmb3IgRE1BMiAqLworCisJCXUzMiBETUExX1NpemVfSVJRX0VuYWJsZV9zaWcgOiAxOyAvKiBXaGVuIHNldCwgYSBwYWNrZXQgY291bnQgZGV0ZWN0b3IgaXMgZW5hYmxlZCBvbiBQQ0kgRE1BMSB0aGF0IGFzc2VydHMgdGhlIFBDSSBpbnRlcnJ1cHQuICovCisJCXUzMiBETUEyX1NpemVfSVJRX0VuYWJsZV9zaWcgOiAxOyAvKiBXaGVuIHNldCwgYSBwYWNrZXQJY291bnQgZGV0ZWN0b3IgaXMgZW5hYmxlZCBvbiBQQ0kgRE1BMiB0aGF0IGFzc2VydHMgdGhlIFBDSSBpbnRlcnJ1cHQuICovCisJCXUzMiBNYWlsYm94X2Zyb21fVjhfRW5hYmxlX3NpZzogMTsgLyogV2hlbiBzZXQsIHdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciBwcm9kdWNlIGFuIGludGVycnVwdCB0byB0aGUKKwkJCQkJCQkJCQkJUENJIGhvc3QgdG8gaW5kaWNhdGUgdGhhdCBtYWlsYm94IGRhdGEgaXMgYXZhaWxhYmxlLiAqLworCisJCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDk7CisJfSBjdHJsXzIwODsKKworLyogR2VuZXJhbCBzdGF0dXMuIFdoZW4gYSBQQ0kgaW50ZXJydXB0IG9jY3VycywgdGhpcyByZWdpc3RlciBpcyByZWFkIHRvCisgKiBkaXNjb3ZlciB0aGUgcmVhc29uIGZvciB0aGUgaW50ZXJydXB0LgorICovCisJc3RydWN0IHsKKwkJdTMyIERNQTFfSVJRX1N0YXR1cyAgIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMSBjb3VudGVyIGhhZCBnZW5lcmF0ZWQgYW4gSVJRLiBSZWFkIE9ubHkuICovCisJCXUzMiBETUExX1RpbWVyX1N0YXR1cyA6IDE7ICAgLyogV2hlbiBzZXQoMSkgdGhlIERNQTEgdGltZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KKwkJdTMyIERNQTJfSVJRX1N0YXR1cyAgIDogMTsgICAvKiBXaGVuIHNldCgxKSB0aGUgRE1BMiBjb3VudGVyIGhhZCBnZW5lcmF0ZWQgYW4gSVJRLiBSZWFkIE9ubHkuICovCisJCXUzMiBETUEyX1RpbWVyX1N0YXR1cyA6IDE7ICAgLyogV2hlbiBzZXQoMSkgdGhlIERNQTIgdGltZXIgaGFkIGdlbmVyYXRlZCBhbiBJUlEuIFJlYWQgT25seS4gKi8KKwkJdTMyIERNQTFfU2l6ZV9JUlFfU3RhdHVzIDogMTsgLyogKFJlYWQgb25seSkuIFRoaXMgcmVnaXN0ZXIgaXMgcmVhZCBhZnRlciBhbiBpbnRlcnJ1cHQgdG8gKi8KKwkJdTMyIERNQTJfU2l6ZV9JUlFfU3RhdHVzIDogMTsgLyogZmluZCBvdXQgd2h5IHdlIGhhZCBhbiBJUlEuIFJlYWRpbmcgdGhpcyByZWdpc3RlciB3aWxsIGNsZWFyIHRoaXMgYml0LiBQYWNrZXQgY291bnQqLworCQl1MzIgTWFpbGJveF9mcm9tX1Y4X1N0YXR1c19zaWc6IDE7IC8qIFNhbWUgYXMgYWJvdmUuIFJlYWRpbmcgdGhpcyByZWdpc3RlciB3aWxsIGNsZWFyIHRoaXMgYml0LiAqLworCQl1MzIgRGF0YV9yZWNlaXZlcl9lcnJvciA6IDE7IC8qIDEgaW5kaWNhdGUgYW4gZXJyb3IgaW4gdGhlIHJlY2VpdmVyIEZyb250IEVuZCAoVHVuZXIgbW9kdWxlKSAqLworCQl1MzIgQ29udGludWl0eV9lcnJvcl9mbGFnIDogMTsgICAvKiAxIGluZGljYXRlcyBhIGNvbnRpbnVpdHkgZXJyb3IgaW4gdGhlIFRTIHN0cmVhbS4gKi8KKwkJdTMyIExMQ19TTkFQX0ZMQUdfc2V0IDogMTsgICAvKiAxIGluZGljYXRlcyB0aGF0IHRoZSBMQ0NfU05BUF9GTEFHIHdhcyBzZXQuICovCisJCXUzMiBUcmFuc3BvcnRfRXJyb3IgICA6IDE7ICAgLyogIFdoZW4gc2V0IGluZGljYXRlcyB0aGF0IGFuIHVuZXhwZWN0ZWQgcGFja2V0IHdhcyByZWNlaXZlZC4gKi8KKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDoyMTsKKwl9IGlycV8yMGM7CisKKworLyogU29mdHdhcmUgcmVzZXQgcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXRfYmxvY2tzICAgICAgOiA4OyAgIC8qIEVuYWJsZWQgd2hlbiBCbG9ja19yZXNldF9lbmFibGUgPSAweEIyIGFuZCAweDIwOCBiaXRzIDE1OjggPSAweDAwLgorCQkJCQkJCQkJCUVhY2ggYml0IGxvY2F0aW9uIHJlcHJlc2VudHMgYSAweDEwMCBibG9jayBvZiByZWdpc3RlcnMuIFdyaXRpbmcKKwkJCQkJCQkJCQlhIG9uZSBpbiBhIGJpdCBsb2NhdGlvbiByZXNldHMgdGhhdCBibG9jayBvZiByZWdpc3RlcnMgYW5kIHRoZSBsb2dpYworCQkJCQkJCQkJCXRoYXQgaXQgY29udHJvbHMuICovCisJCXUzMiBCbG9ja19yZXNldF9lbmFibGUgOiA4OyAgLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMHhCMiB3aGVuIHRoZSByZWdpc3RlciBpcyB3cml0dGVuLiAqLworCQl1MzIgU3BlY2lhbF9jb250cm9scyAgOjE2OyAgIC8qIEFzc2VydHMgUmVzZXRfVjggPT4gMHhDMjU4OyBUdXJucyBvbiBwY2kgZW5jcnlwdGlvbiA9PiAweEMyNUE7CisJCQkJCQkJCQkJVHVybnMgb2ZmIHBjaSBlbmNyeXB0aW9uID0+IDB4QzI1OSBOb3RlOiBwY2lfZW5jcnlwdGlvbiBkZWZhdWx0CisJCQkJCQkJCQkJYXQgcG93ZXItdXAgaXMgT04uICovCisJfSBzd19yZXNldF8yMTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgdnVhcnRfb2Vfc2lnICAgICAgOiAxOyAgIC8qIFdoZW4gY2xlYXIsIHRoZSBWOCBwcm9jZXNzb3IgaGFzIHNvbGUgY29udHJvbCBvZiB0aGUgc2VyaWFsIFVBUlQKKwkJCQkJCQkJCQkoUlMtMjMyIFNtYXJ0IENhcmQgaW50ZXJmYWNlKS4gV2hlbiBzZXQsIHRoZSBJQkkgaW50ZXJmYWNlCisJCQkJCQkJCQkJZGVmaW5lZCBieSByZWdpc3RlciAweDYwMCBjb250cm9scyB0aGUgc2VyaWFsIFVBUlQuICovCisJCXUzMiB2MldTX29lX3NpZyAgICAgICA6IDE7ICAgLyogV2hlbiBjbGVhciwgdGhlIFY4IHByb2Nlc3NvciBoYXMgZGlyZWN0IGNvbnRyb2wgb2YgdGhlIFR3by1saW5lCisJCQkJCQkJCQkJU2VyaWFsIE1hc3RlciBFRVBST00gdGFyZ2V0LiBXaGVuIHNldCwgdGhlIFR3by1saW5lIFNlcmlhbCBNYXN0ZXIKKwkJCQkJCQkJCQlFRVBST00gdGFyZ2V0IGludGVyZmFjZSBpcyBjb250cm9sbGVkIGJ5IElCSSByZWdpc3RlciAweDEwMC4gKi8KKwkJdTMyIGhhbHRfVjhfc2lnICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgY29udGlndW91cyB3YWl0IHN0YXRlcyBhcmUgYXBwbGllZCB0byB0aGUgVjgtc3BhY2UKKwkJCQkJCQkJCQlidXMgbWFzdGVycy4gT25jZSB0aGlzIHNpZ25hbCBpcyBjbGVhcmVkLCBub3JtYWwgVjgtc3BhY2UKKwkJCQkJCQkJCQlvcGVyYXRpb25zIHJlc3VtZS4gKi8KKwkJdTMyIHNlY3Rpb25fcGtnX2VuYWJsZV9zaWc6IDE7IC8qIFdoZW4gc2V0LCB0aGlzIHNpZ25hbCBlbmFibGVzIHRoZSBmcm9udCBlbmQgdHJhbnNsYXRpb24gY2lyY3VpdHJ5CisJCQkJCQkJCQkJICB0byBwcm9jZXNzIHNlY3Rpb24gcGFja2VkIHRyYW5zcG9ydCBzdHJlYW1zLiAqLworCQl1MzIgczJwX3NlbF9zaWcgICAgICAgOiAxOyAgIC8qIFNlcmlhbCB0byBwYXJhbGxlbCBjb252ZXJzaW9uLiBXaGVuIHNldCwgcG9sYXJpemVkIHRyYW5zcG9ydCBkYXRhCisJCQkJCQkJCQkJd2l0aGluIHRoZSBGbGV4Q29wMyBmcm9udCBlbmQgY2lyY3VpdHJ5IGlzIGNvbnZlcnRlZCBmcm9tIGEgc2VyaWFsCisJCQkJCQkJCQkJc3RyZWFtIGludG8gcGFyYWxsZWwgZGF0YSBiZWZvcmUgZG93bnN0cmVhbSBwcm9jZXNzaW5nIG90aGVyd2lzZQorCQkJCQkJCQkJCWludGVycHJldHMgdGhlIGRhdGEuICovCisJCXUzMiB1bnVzZWQxICAgICAgICAgICA6IDM7CisJCXUzMiBwb2xhcml0eV9QU19DTEtfc2lnOiAxOyAgLyogVGhpcyBzaWduYWwgaXMgdXNlZCB0byBpbnZlcnQgdGhlIGlucHV0IHBvbGFyaXR5IG9mIHRoZSB0cmFucG9ydAorCQkJCQkJCQkJCXN0cmVhbSBDTE9DSyBzaWduYWwgYmVmb3JlIGFueSBwcm9jZXNzaW5nIG9jY3VycyBvbiB0aGUgdHJhbnNwb3J0CisJCQkJCQkJCQkJc3RyZWFtIHdpdGhpbiBGbGV4Q29wMy4gKi8KKwkJdTMyIHBvbGFyaXR5X1BTX1ZBTElEX3NpZzogMTsgLyogVGhpcyBzaWduYWwgaXMgdXNlZCB0byBpbnZlcnQgdGhlIGlucHV0IHBvbGFyaXR5IG9mIHRoZSB0cmFucG9ydAorCQkJCQkJCQkJCXN0cmVhbSBWQUxJRCBzaWduYWwgYmVmb3JlIGFueSBwcm9jZXNzaW5nIG9jY3VycyBvbiB0aGUgdHJhbnNwb3J0CisJCQkJCQkJCQkJc3RyZWFtIHdpdGhpbiBGbGV4Q29wMy4gKi8KKwkJdTMyIHBvbGFyaXR5X1BTX1NZTkNfc2lnOiAxOyAvKiBUaGlzIHNpZ25hbCBpcyB1c2VkIHRvIGludmVydCB0aGUgaW5wdXQgcG9sYXJpdHkgb2YgdGhlIHRyYW5wb3J0CisJCQkJCQkJCQkJc3RyZWFtIFNZTkMgc2lnbmFsIGJlZm9yZSBhbnkgcHJvY2Vzc2luZyBvY2N1cnMgb24gdGhlIHRyYW5zcG9ydAorCQkJCQkJCQkJCXN0cmVhbSB3aXRoaW4gRmxleENvcDMuICovCisJCXUzMiBwb2xhcml0eV9QU19FUlJfc2lnOiAxOyAgLyogVGhpcyBzaWduYWwgaXMgdXNlZCB0byBpbnZlcnQgdGhlIGlucHV0IHBvbGFyaXR5IG9mIHRoZSB0cmFucG9ydAorCQkJCQkJCQkJCXN0cmVhbSBFUlJPUiBzaWduYWwgYmVmb3JlIGFueSBwcm9jZXNzaW5nIG9jY3VycyBvbiB0aGUgdHJhbnNwb3J0CisJCQkJCQkJCQkJc3RyZWFtIHdpdGhpbiBGbGV4Q29wMy4gKi8KKwkJdTMyIHVudXNlZDIgICAgICAgICAgIDoyMDsKKwl9IG1pc2NfMjE0OworCisvKiBNYWlsYm94IGZyb20gVjggdG8gaG9zdCAqLworCXN0cnVjdCB7CisJCXUzMiBNYWlsYm94X2Zyb21fVjggICA6MzI7ICAgLyogV2hlbiB0aGlzIHJlZ2lzdGVyIGlzIHdyaXR0ZW4gYnkgZWl0aGVyIHRoZSBWOCBwcm9jZXNzb3Igb3IgYnkgYW4KKwkJCQkJCQkJCQllbmQgaG9zdCwgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB0byB0aGUgUENJIGhvc3QgdG8gaW5kaWNhdGUKKwkJCQkJCQkJCQl0aGF0IG1haWxib3ggZGF0YSBpcyBhdmFpbGFibGUuIFJlYWRpbmcgcmVnaXN0ZXIgMjBjIHdpbGwgY2xlYXIKKwkJCQkJCQkJCQl0aGUgSVJRLiAqLworCX0gbWJveF92OF90b19ob3N0XzIxODsKKworLyogTWFpbGJveCBmcm9tIGhvc3QgdG8gdjggTWFpbGJveF90b19WOAorICogTWFpbGJveF90b19WOCBtYWlsYm94IHN0b3JhZ2UgcmVnaXN0ZXIKKyAqIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyBmcm9tIFBDSSB0byBWOC4gV3JpdGluZyB0byB0aGlzIHJlZ2lzdGVyIHdpbGwgc2VuZCBhbgorICogSVJRIHRvIHRoZSBWOC4gVGhlbiBpdCBjYW4gcmVhZCB0aGUgZGF0YSBmcm9tIGhlcmUuIFJlYWRpbmcgdGhpcyByZWdpc3RlcgorICogd2lsbCBjbGVhciB0aGUgSVJRLiBJZiB0aGUgVjggaXMgaGFsdGVkIGFuZCBiaXQgMzEgb2YgdGhpcyByZWdpc3RlciBpcyBzZXQsCisgKiB0aGVuIHRoaXMgcmVnaXN0ZXIgaXMgdXNlZCBpbnN0ZWFkIGFzIGEgZGlyZWN0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlCisgKiBWOHNwYWNlIG1lbW9yeS4KKyAqLworCXN0cnVjdCB7CisJCXUzMiBzeXNyYW1hY2Nlc3NfZGF0YSA6IDg7ICAgLyogRGF0YSBieXRlIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBWOCBTeXNSQU0uICovCisJCXUzMiBzeXNyYW1hY2Nlc3NfYWRkciA6MTU7ICAgLyogMTUgYml0IGFkZHJlc3MgdXNlZCB0byBhY2Nlc3MgVjggU3lzLVJBTS4gKi8KKwkJdTMyIHVudXNlZCAgICAgICAgICAgIDogNzsKKwkJdTMyIHN5c3JhbWFjY2Vzc193cml0ZTogMTsgICAvKiBXcml0ZSBmbGFnIHVzZWQgdG8gbGF0Y2ggZGF0YSBpbnRvIHRoZSBWOCBTeXNSQU0uICovCisJCXUzMiBzeXNyYW1hY2Nlc3NfYnVzbXVzdGVyOiAxOyAvKiBTZXR0aW5nIHRoaXMgYml0IHdoZW4gdGhlIFY4IGlzIGhhbHRlZCBhdCAweDIxNCBCaXQoMikgYWxsb3dzCisJCQkJCQkJCQkJICB0aGlzIElCSSByZWdpc3RlciBpbnRlcmZhY2UgdG8gZGlyZWN0bHkgZHJpdmUgdGhlIFY4LXNwYWNlIG1lbW9yeS4gKi8KKwl9IG1ib3hfaG9zdF90b192OF8yMWM7CisKKworLyogUElEcywgVHJhbnNsYXRpb24gQml0LCBTTUMgRmlsdGVyIFNlbGVjdCAweDMwMCB0byAweDMxYyAqLworCXN0cnVjdCB7CisJCXUzMiBTdHJlYW0xX1BJRCAgICAgICA6MTM7ICAgLyogUHJpbWFyeSB1c2UgaXMgcmVjZWl2aW5nIE5ldCBkYXRhLCBzbyB0aGVzZSAxMyBiaXRzIG5vcm1hbGx5CisJCQkJCQkJCQkJaG9sZCB0aGUgUElEIHZhbHVlIGZvciB0aGUgZGVzaXJlZCBuZXR3b3JrIHN0cmVhbS4gKi8KKwkJdTMyIFN0cmVhbTFfdHJhbnMgICAgIDogMTsgICAvKiBXaGVuIHNldCwgTmV0IHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgTmV0IGRhdGEgZmVycmllZCBpbiBUUyBwYWNrZXRzLiAqLworCQl1MzIgTUFDX011bHRpY2FzdF9maWx0ZXIgOiAxOyAgIC8qIFdoZW4gY2xlYXIsIG11bHRpY2FzdCBNQUMgZmlsdGVyaW5nIGlzIG5vdCBhbGxvd2VkIGZvciBTdHJlYW0xIGFuZCBQSURfbiBmaWx0ZXJzLiAqLworCQl1MzIgZGVidWdfZmxhZ19waWRfc2F2ZWQgOiAxOworCQl1MzIgU3RyZWFtMl9QSUQgICAgICAgOjEzOyAgIC8qIDEzIGJpdHMgZm9yIFN0cmVhbSAyIFBJRCBmaWx0ZXIgdmFsdWUuIEdlbmVyYWwgdXNlLiAqLworCQl1MzIgU3RyZWFtMl90cmFucyAgICAgOiAxOyAgIC8qIFdoZW4gc2V0IFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGUgZGF0YSBmZXJyaWVkIGluCisJCQkJCQkJCQkJU3RyZWFtMl9QSUQgVFMgcGFja2V0cy4gKi8KKwkJdTMyIGRlYnVnX2ZsYWdfd3JpdGVfc3RhdHVzMDAgOiAxOworCQl1MzIgZGVidWdfZmlmb19wcm9ibGVtIDogMTsKKwl9IHBpZF9maWx0ZXJfMzAwOworCisJc3RydWN0IHsKKwkJdTMyIFBDUl9QSUQgICAgICAgICAgIDoxMzsgICAvKiBQQ1Igc3RyZWFtIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIFByb2dyYW0gQ2xvY2sgUmVmZXJlbmNlIHN0cmVhbSBmaWx0ZXJpbmcuICovCisJCXUzMiBQQ1JfdHJhbnMgICAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLworCQl1MzIgZGVidWdfb3ZlcnJ1bjMgICAgOiAxOworCQl1MzIgZGVidWdfb3ZlcnJ1bjIgICAgOiAxOworCQl1MzIgUE1UX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIHN0cmVhbSBQSUQgZmlsdGVyIHZhbHVlLiBQcmltYXJ5IHVzZSBpcyBQcm9ncmFtIE1hbmFnZW1lbnQgVGFibGUgc2VnbWVudCBmaWx0ZXJpbmcuICovCisJCXUzMiBQTVRfdHJhbnMgICAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAyOworCX0gcGlkX2ZpbHRlcl8zMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgRU1NX1BJRCAgICAgICAgICAgOjEzOyAgIC8qIEVNTSBQSUQgZmlsdGVyIHZhbHVlLiBQcmltYXJ5IHVzZSBpcyBFbnRpdGxlbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2luZyBmb3IKKwkJCQkJCQkJCQljb25kaXRpb25hbCBhY2Nlc3MtcmVsYXRlZCBkYXRhLiAqLworCQl1MzIgRU1NX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KKwkJdTMyIEVNTV9maWx0ZXJfNCAgICAgIDogMTsgICAvKiBXaGVuIHNldCB3aWxsIHBhc3Mgb25seSBFTU0gZGF0YSBwb3NzZXNzaW5nIHRoZSBzYW1lIElEIGNvZGUgYXMgdGhlCisJCQkJCQkJCQkJZmlyc3QgZm91ciBieXRlcyAoMzIgYml0cykgb2YgdGhlIGVuZC11c2VyIHMgNi1ieXRlIFNtYXJ0IENhcmQgSUQgbnVtYmVyIFNlbGVjdCAqLworCQl1MzIgRU1NX2ZpbHRlcl82ICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0IHdpbGwgcGFzcyBvbmx5IEVNTSBkYXRhIHBvc3Nlc3NpbmcgdGhlIHNhbWUgNi1ieXRlIGNvZGUgYXMgdGhlIGVuZC11c2VycworCQkJCQkJCQkJCWNvbXBsZXRlIDYtYnl0ZSBTbWFydCBDYXJkIElEIG51bWJlci4gKi8KKwkJdTMyIEVDTV9QSUQgICAgICAgICAgIDoxMzsgICAvKiBFQ00gUElEIGZpbHRlciB2YWx1ZS4gUHJpbWFyeSB1c2UgaXMgRW50aXRsZW1lbnQgQ29udHJvbCBNZXNzYWdpbmcgZm9yIGNvbmRpdGlvbmFsCisJCQkJCQkJCQkJYWNjZXNzLXJlbGF0ZWQgZGF0YS4gKi8KKwkJdTMyIEVDTV90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCisJCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwODsKKworCXN0cnVjdCB7CisJCXUzMiBHcm91cF9QSUQgICAgIDoxMzsgICAvKiBQSUQgdmFsdWUgZm9yIGdyb3VwIGZpbHRlcmluZy4gKi8KKwkJdTMyIEdyb3VwX3RyYW5zICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KKwkJdTMyIHVudXNlZDEgICAgICAgOiAyOworCQl1MzIgR3JvdXBfbWFzayAgICA6MTM7ICAgLyogTWFzayB2YWx1ZSB1c2VkIGluIGxvZ2ljYWwgImFuZCIgZXF1YXRpb24gdGhhdCBkZWZpbmVzIGdyb3VwIGZpbHRlcmluZyAqLworCQl1MzIgdW51c2VkMiAgICAgICA6IDM7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzBfNzsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfbWFzdGVyX3JlYWQgOjE3OworCQl1MzIgdW51c2VkICAgICAgICA6MTU7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzE7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X21hc3Rlcl93cml0ZSA6MTc7CisJCXUzMiB1bnVzZWQgICAgICAgIDoxNTsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMjsKKworCXN0cnVjdCB7CisJCXUzMiBuZXh0X25ldF9tYXN0ZXJfd3JpdGUgOjE3OworCQl1MzIgdW51c2VkICAgICAgICA6MTU7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkMSAgICAgICA6IDE7CisJCXUzMiBzdGF0ZV93cml0ZSAgIDoxMDsKKwkJdTMyIHJlc2VydmVkMSAgICAgOiA2OyAgIC8qIGRlZmF1bHQ6IDAwMDEwMCAqLworCQl1MzIgc3RhY2tfcmVhZCAgICA6MTA7CisJCXUzMiByZXNlcnZlZDIgICAgIDogNTsgICAvKiBkZWZhdWx0OiAwMDEwMCAqLworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF80OworCisJc3RydWN0IHsKKwkJdTMyIHN0YWNrX2NudCAgICAgOjEwOworCQl1MzIgdW51c2VkICAgICAgICA6MjI7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzU7CisKKwlzdHJ1Y3QgeworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzEgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzIgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzMgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzQgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzMwMCA6IDI7CisJCXUzMiB3cml0ZV9zdGF0dXMxIDogMjsKKwkJdTMyIHdyaXRlX3N0YXR1czQgOiAyOworCQl1MzIgZGF0YV9zaXplX3JlZyA6MTI7CisJCXUzMiB1bnVzZWQgICAgICAgIDogNDsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNjsKKworCXN0cnVjdCB7CisJCXUzMiBpbmRleF9yZWcgICAgICAgICA6IDU7ICAgLyogKEluZGV4IHBvaW50ZXIpIFBvaW50cyBhdCBhbiBpbnRlcm5hbCBQSURuIHJlZ2lzdGVyLiBBIGJpbmFyeSBjb2RlCisJCQkJCQkJCQkJcmVwcmVzZW50aW5nIG9uZSBvZiAzMiBpbnRlcm5hbCBQSURuIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIGl0cworCQkJCQkJCQkJCWNvcnJlc3BvbmRpbmcgaW50ZXJuYWwgTUFDX2xvd24gcmVnaXN0ZXIuICovCisJCXUzMiBleHRyYV9pbmRleF9yZWcgICA6IDM7ICAgLyogVGhpcyB2ZWN0b3IgaXMgdXNlZCB0byBzZWxlY3QgYmV0d2VlbiBzZXRzIG9mIGRlYnVnIHNpZ25hbHMgcm91dGVkIHRvIHJlZ2lzdGVyIDB4MzBjLiAqLworCQl1MzIgQUJfc2VsZWN0ICAgICAgICAgOiAxOyAgIC8qIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAweDMxYy4gcmVhZC93cml0ZSB0byB0aGUgTUFDX2hpZ2hBIG9yIE1BQ19oaWdoQiByZWdpc3RlcgorCQkJCQkJCQkJCTA9TUFDX2hpZ2hCIHJlZ2lzdGVyLCAxPU1BQ19oaWdoQSAqLworCQl1MzIgcGFzc19hbGx0YWJsZXMgICAgOiAxOyAgIC8qIDE9TmV0IHBhY2tldHMgYXJlIG5vdCBmaWx0ZXJlZCBhZ2FpbnN0IHRoZSBOZXR3b3JrIFRhYmxlIElEIGZvdW5kIGluIHJlZ2lzdGVyIDB4NDAwLgorCQkJCQkJCQkJCUFsbCB0eXBlcyBvZiBuZXR3b3JrcyAoRFZCLCBBVFNDLCBJU0RCKSBhcmUgcGFzc2VkLiAqLworCQl1MzIgdW51c2VkICAgICAgICAgICAgOjIyOworCX0gaW5kZXhfcmVnXzMxMDsKKworCXN0cnVjdCB7CisJCXUzMiBQSUQgICAgICAgICAgICAgICA6MTM7ICAgLyogUElEIHZhbHVlICovCisJCXUzMiBQSURfdHJhbnMgICAgICAgICA6IDE7ICAgLyogdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciBwYWNrZXRzIGZpbHRlcmVkICovCisJCXUzMiBQSURfZW5hYmxlX2JpdCAgICA6IDE7ICAgLyogV2hlbiBzZXQgdGhpcyBQSUQgZmlsdGVyIGlzIGVuYWJsZWQgKi8KKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDoxNzsKKwl9IHBpZF9uX3JlZ18zMTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgQTRfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgQTVfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgQTZfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgRW5hYmxlX2JpdCAgICAgICAgOiAxOyAgIC8qIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgxKSAqLworCQl1MzIgSGlnaEFCX2JpdCAgICAgICAgOiAxOyAgIC8qIHVzZSBNQUNfaGlnaEEgKDEpIG9yIE1BQ19oaWdoQiAoMCkgYXMgTVNCICovCisJCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDY7CisJfSBtYWNfbG93X3JlZ18zMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQTFfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgQTJfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgQTNfYnl0ZSAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiA4OworCX0gbWFjX2hpZ2hfcmVnXzMxYzsKKworLyogVGFibGUsIFNNQ0lELE1BQ0Rlc3RpbmF0aW9uIEZpbHRlcnMgMHg0MDAgdG8gMHg0MWMgKi8KKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjE2OworI2RlZmluZSBmY19kYXRhX1RhZ19JRF9EVkIgIDB4M2UKKyNkZWZpbmUgZmNfZGF0YV9UYWdfSURfQVRTQyAweDNmCisjZGVmaW5lIGZjX2RhdGFfVGFnX0lEX0lEU0IgMHg4YgorCQl1MzIgZGF0YV9UYWdfSUQgICAgICAgOjE2OworCX0gZGF0YV90YWdfNDAwOworCisJc3RydWN0IHsKKwkJdTMyIENhcmRfSURieXRlNiAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNSAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNCAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlMyAgICAgIDogODsKKwl9IGNhcmRfaWRfNDA4OworCisJc3RydWN0IHsKKwkJdTMyIENhcmRfSURieXRlMiAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlMSAgICAgIDogODsKKwl9IGNhcmRfaWRfNDBjOworCisJLyogaG9sZGluZyB0aGUgdW5pcXVlIG1hYyBhZGRyZXNzIG9mIHRoZSByZWNlaXZlciB3aGljaCBob3VzZXMgdGhlIEZsZXhDb3BJSUkgKi8KKwlzdHJ1Y3QgeworCQl1MzIgTUFDMSAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMiAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMyAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDNiAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2FkZHJlc3NfNDE4OworCisJc3RydWN0IHsKKwkJdTMyIE1BQzcgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzggICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDogMTY7CisJfSBtYWNfYWRkcmVzc180MWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdHJhbnNtaXR0ZXJfZGF0YV9ieXRlIDogODsKKwkJdTMyIFJlY2VpdmVEYXRhUmVhZHkgIDogMTsKKwkJdTMyIFJlY2VpdmVCeXRlRnJhbWVFcnJvcjogMTsKKwkJdTMyIHR4YnVmZmVtcHR5ICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDoyMTsKKwl9IGNpXzYwMDsKKworCXN0cnVjdCB7CisJCXUzMiBwaV9kICAgICAgICAgICAgICA6IDg7CisJCXUzMiBwaV9oYSAgICAgICAgICAgICA6MjA7CisJCXUzMiBwaV9ydyAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV9jb21wb25lbnRfcmVnICA6IDM7CisJfSBwaV82MDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgc2VyaWFsUmVzZXQgICAgICAgOiAxOworCQl1MzIgb25jZWN5Y2xlX3JlYWQgICAgOiAxOworCQl1MzIgVGltZXJfUmVhZF9yZXEgICAgOiAxOworCQl1MzIgVGltZXJfTG9hZF9yZXEgICAgOiAxOworCQl1MzIgdGltZXJfZGF0YSAgICAgICAgOiA3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgOiAxOyAvKiA/Pz8gbm90IG1lbnRpb25lZCBpbiBkYXRhIGJvb2sgKi8KKwkJdTMyIFRpbWVyX2FkZHIgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDogMzsKKwkJdTMyIHBjbWNpYV9hX21vZF9wd3JfbiA6IDE7CisJCXUzMiBwY21jaWFfYl9tb2RfcHdyX24gOiAxOworCQl1MzIgY29uZmlnX0RvbmVfc3RhdCAgOiAxOworCQl1MzIgY29uZmlnX0luaXRfc3RhdCAgOiAxOworCQl1MzIgY29uZmlnX1Byb2dfbiAgICAgOiAxOworCQl1MzIgY29uZmlnX3dyX24gICAgICAgOiAxOworCQl1MzIgY29uZmlnX2NzX24gICAgICAgOiAxOworCQl1MzIgY29uZmlnX2NjbGsgICAgICAgOiAxOworCQl1MzIgcGlfQ2lNYXhfSVJRX24gICAgOiAxOworCQl1MzIgcGlfdGltZW91dF9zdGF0dXMgOiAxOworCQl1MzIgcGlfd2FpdF9uICAgICAgICAgOiAxOworCQl1MzIgcGlfYnVzeV9uICAgICAgICAgOiAxOworCX0gcGlfNjA4OworCisJc3RydWN0IHsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIGtleV9lbmFibGUgICAgICAgIDogMTsKKyNkZWZpbmUgZmNfa2V5X2NvZGVfZGVmYXVsdCAweDEKKyNkZWZpbmUgZmNfa2V5X2NvZGVfZXZlbiAgICAweDIKKyNkZWZpbmUgZmNfa2V5X2NvZGVfb2RkICAgICAweDMKKwkJdTMyIGtleV9jb2RlICAgICAgICAgIDogMjsKKwkJdTMyIGtleV9hcnJheV9jb2wgICAgIDogMzsKKwkJdTMyIGtleV9hcnJheV9yb3cgICAgIDogNTsKKwkJdTMyIGR2Yl9lbiAgICAgICAgICAgIDogMTsgLyogMD1UUyBieXBhc3NlcyB0aGUgRGVzY3JhbWJsZXIgKi8KKwkJdTMyIHJ3X2ZsYWcgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDogNjsKKwl9IGR2Yl9yZWdfNjBjOworCisvKiBTUkFNIGFuZCBPdXRwdXQgRGVzdGluYXRpb24gMHg3MDAgdG8gMHg3MTQgKi8KKwlzdHJ1Y3QgeworCQl1MzIgc3JhbV9hZGRyICAgICAgICAgOjE1OworCQl1MzIgc3JhbV9ydyAgICAgICAgICAgOiAxOyAgIC8qIDA9d3JpdGUsIDE9cmVhZCAqLworCQl1MzIgc3JhbV9kYXRhICAgICAgICAgOiA4OworCQl1MzIgc2NfeGZlcl9iaXQgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAzOworCQl1MzIgb2VfcGluX3JlZyAgICAgICAgOiAxOworCQl1MzIgY2VfcGluX3JlZyAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiAxOworCQl1MzIgc3RhcnRfc3JhbV9pYmkgICAgOiAxOworCX0gc3JhbV9jdHJsX3JlZ183MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2FkZHJfcmVhZCAgICAgOjE2OworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgOjE2OworCX0gbmV0X2J1Zl9yZWdfNzA0OworCisJc3RydWN0IHsKKwkJdTMyIGNhaV9yZWFkICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNTsKKwkJdTMyIGNhaV93cml0ZSAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNjsKKwkJdTMyIGNhaV9jbnQgICAgICAgICAgIDogNDsKKwl9IGNhaV9idWZfcmVnXzcwODsKKworCXN0cnVjdCB7CisJCXUzMiBjYW9fcmVhZCAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDU7CisJCXUzMiBjYXBfd3JpdGUgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDY7CisJCXUzMiBjYW9fY250ICAgICAgICAgICA6IDQ7CisJfSBjYW9fYnVmX3JlZ183MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgbWVkaWFfcmVhZCAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA1OworCQl1MzIgbWVkaWFfd3JpdGUgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiA2OworCQl1MzIgbWVkaWFfY250ICAgICAgICAgOiA0OworCX0gbWVkaWFfYnVmX3JlZ183MTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgTkVUX0Rlc3QgICAgICAgICAgOiAyOworCQl1MzIgQ0FJX0Rlc3QgICAgICAgICAgOiAyOworCQl1MzIgQ0FPX0Rlc3QgICAgICAgICAgOiAyOworCQl1MzIgTUVESUFfRGVzdCAgICAgICAgOiAyOworCQl1MzIgbmV0X292Zmxvd19lcnJvciAgOiAxOworCQl1MzIgbWVkaWFfb3ZmbG93X2Vycm9yIDogMTsKKwkJdTMyIGNhaV9vdmZsb3dfZXJyb3IgIDogMTsKKwkJdTMyIGNhb19vdmZsb3dfZXJyb3IgIDogMTsKKwkJdTMyIGN0cmxfdXNiX3dhbiAgICAgIDogMTsKKwkJdTMyIGN0cmxfc3JhbWRtYSAgICAgIDogMTsKKwkJdTMyIGN0cmxfbWF4aW11bWZpbGwgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgIDoxNzsKKwl9IHNyYW1fZGVzdF9yZWdfNzE0OworCisJc3RydWN0IHsKKwkJdTMyIG5ldF9jbnQgICAgICAgICAgIDoxMjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNDsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogMzsKKwkJdTMyIG5ldF9hZGRyX3dyaXRlICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMyAgICAgICAgIDoxMTsKKwl9IG5ldF9idWZfcmVnXzcxODsKKworCXN0cnVjdCB7CisJCXUzMiB3YW5fc3BlZWRfc2lnICAgICA6IDI7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDY7CisJCXUzMiB3YW5fd2FpdF9zdGF0ZSAgICA6IDg7CisJCXUzMiBzcmFtX2NoaXAgICAgICAgICA6IDI7CisJCXUzMiBzcmFtX21lbW1hcCAgICAgICA6IDI7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDQ7CisJCXUzMiB3YW5fcGt0X2ZyYW1lICAgICA6IDQ7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICA6IDQ7CisJfSB3YW5fY3RybF9yZWdfNzFjOworfSBmbGV4Y29wX2liaV92YWx1ZTsKKworZXh0ZXJuIGZsZXhjb3BfaWJpX3ZhbHVlIGliaV96ZXJvOworCit0eXBlZGVmIGVudW0geworCUZDX0kyQ19QT1JUX0RFTU9EICA9IDEsCisJRkNfSTJDX1BPUlRfRUVQUk9NID0gMiwKKwlGQ19JMkNfUE9SVF9UVU5FUiAgPSAzLAorfSBmbGV4Y29wX2kyY19wb3J0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisJRkNfV1JJVEUgPSAwLAorCUZDX1JFQUQgID0gMSwKK30gZmxleGNvcF9hY2Nlc3Nfb3BfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlGQ19TUkFNX0RFU1RfTkVUICAgPSAxLAorCUZDX1NSQU1fREVTVF9DQUkgICA9IDIsCisJRkNfU1JBTV9ERVNUX0NBTyAgID0gNCwKKwlGQ19TUkFNX0RFU1RfTUVESUEgPSA4Cit9IGZsZXhjb3Bfc3JhbV9kZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisJRkNfU1JBTV9ERVNUX1RBUkdFVF9XQU5fVVNCID0gMCwKKwlGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTEgICAgPSAxLAorCUZDX1NSQU1fREVTVF9UQVJHRVRfRE1BMiAgICA9IDIsCisJRkNfU1JBTV9ERVNUX1RBUkdFVF9GQzNfQ0EgID0gMworfSBmbGV4Y29wX3NyYW1fZGVzdF90YXJnZXRfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlGQ19TUkFNXzJfMzJLQiAgPSAwLCAvKiAgNjRLQiAqLworCUZDX1NSQU1fMV8zMktCICA9IDEsIC8qICAzMktCIC0gZGVmYXVsdCBmb3cgRkNJSSAqLworCUZDX1NSQU1fMV8xMjhLQiA9IDIsIC8qIDEyOEtCICovCisJRkNfU1JBTV8xXzQ4S0IgID0gMywgLyogIDQ4S0IgLSBkZWZhdWx0IGZvciBGQ0lJSSAqLworfSBmbGV4Y29wX3NyYW1fdHlwZV90OworCit0eXBlZGVmIGVudW0geworCUZDX1dBTl9TUEVFRF80TUJJVFMgID0gMCwKKwlGQ19XQU5fU1BFRURfOE1CSVRTICA9IDEsCisJRkNfV0FOX1NQRUVEXzEyTUJJVFMgPSAyLAorCUZDX1dBTl9TUEVFRF8xNk1CSVRTID0gMywKK30gZmxleGNvcF93YW5fc3BlZWRfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlGQ19ETUFfMSA9IDEsCisJRkNfRE1BXzIgPSAyLAorfSBmbGV4Y29wX2RtYV9pbmRleF90OworCit0eXBlZGVmIGVudW0geworCUZDX0RNQV9TVUJBRERSXzAgPSAxLAorCUZDX0RNQV9TVUJBRERSXzEgPSAyLAorfSBmbGV4Y29wX2RtYV9hZGRyX2luZGV4X3Q7CisKKy8qIG5hbWVzIG9mIHRoZSBwYXJ0aWN1bGFyIHJlZ2lzdGVycyAqLwordHlwZWRlZiBlbnVtIHsKKwlkbWExXzAwMCAgICAgICAgICAgID0gMHgwMDAsCisJZG1hMV8wMDQgICAgICAgICAgICA9IDB4MDA0LAorCWRtYTFfMDA4ICAgICAgICAgICAgPSAweDAwOCwKKwlkbWExXzAwYyAgICAgICAgICAgID0gMHgwMGMsCisJZG1hMl8wMTAgICAgICAgICAgICA9IDB4MDEwLAorCWRtYTJfMDE0ICAgICAgICAgICAgPSAweDAxNCwKKwlkbWEyXzAxOCAgICAgICAgICAgID0gMHgwMTgsCisJZG1hMl8wMWMgICAgICAgICAgICA9IDB4MDFjLAorCisJdHdfc21fY18xMDAgICAgICAgICA9IDB4MTAwLAorCXR3X3NtX2NfMTA0ICAgICAgICAgPSAweDEwNCwKKwl0d19zbV9jXzEwOCAgICAgICAgID0gMHgxMDgsCisJdHdfc21fY18xMGMgICAgICAgICA9IDB4MTBjLAorCXR3X3NtX2NfMTEwICAgICAgICAgPSAweDExMCwKKworCWxuYl9zd2l0Y2hfZnJlcV8yMDAgPSAweDIwMCwKKwltaXNjXzIwNCAgICAgICAgICAgID0gMHgyMDQsCisJY3RybF8yMDggICAgICAgICAgICA9IDB4MjA4LAorCWlycV8yMGMgICAgICAgICAgICAgPSAweDIwYywKKwlzd19yZXNldF8yMTAgICAgICAgID0gMHgyMTAsCisJbWlzY18yMTQgICAgICAgICAgICA9IDB4MjE0LAorCW1ib3hfdjhfdG9faG9zdF8yMTggPSAweDIxOCwKKwltYm94X2hvc3RfdG9fdjhfMjFjID0gMHgyMWMsCisKKwlwaWRfZmlsdGVyXzMwMCAgICAgID0gMHgzMDAsCisJcGlkX2ZpbHRlcl8zMDQgICAgICA9IDB4MzA0LAorCXBpZF9maWx0ZXJfMzA4ICAgICAgPSAweDMwOCwKKwlwaWRfZmlsdGVyXzMwYyAgICAgID0gMHgzMGMsCisJaW5kZXhfcmVnXzMxMCAgICAgICA9IDB4MzEwLAorCXBpZF9uX3JlZ18zMTQgICAgICAgPSAweDMxNCwKKwltYWNfbG93X3JlZ18zMTggICAgID0gMHgzMTgsCisJbWFjX2hpZ2hfcmVnXzMxYyAgICA9IDB4MzFjLAorCisJZGF0YV90YWdfNDAwICAgICAgICA9IDB4NDAwLAorCWNhcmRfaWRfNDA4ICAgICAgICAgPSAweDQwOCwKKwljYXJkX2lkXzQwYyAgICAgICAgID0gMHg0MGMsCisJbWFjX2FkZHJlc3NfNDE4ICAgICA9IDB4NDE4LAorCW1hY19hZGRyZXNzXzQxYyAgICAgPSAweDQxYywKKworCWNpXzYwMCAgICAgICAgICAgICAgPSAweDYwMCwKKwlwaV82MDQgICAgICAgICAgICAgID0gMHg2MDQsCisJcGlfNjA4ICAgICAgICAgICAgICA9IDB4NjA4LAorCWR2Yl9yZWdfNjBjICAgICAgICAgPSAweDYwYywKKworCXNyYW1fY3RybF9yZWdfNzAwICAgPSAweDcwMCwKKwluZXRfYnVmX3JlZ183MDQgICAgID0gMHg3MDQsCisJY2FpX2J1Zl9yZWdfNzA4ICAgICA9IDB4NzA4LAorCWNhb19idWZfcmVnXzcwYyAgICAgPSAweDcwYywKKwltZWRpYV9idWZfcmVnXzcxMCAgID0gMHg3MTAsCisJc3JhbV9kZXN0X3JlZ183MTQgICA9IDB4NzE0LAorCW5ldF9idWZfcmVnXzcxOCAgICAgPSAweDcxOCwKKwl3YW5fY3RybF9yZWdfNzFjICAgID0gMHg3MWMsCit9IGZsZXhjb3BfaWJpX3JlZ2lzdGVyOworCisjZGVmaW5lIGZsZXhjb3Bfc2V0X2liaV92YWx1ZShyZWcsYXR0cix2YWwpIHsgXAorCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHJlZyk7IFwKKwl2LnJlZy5hdHRyID0gdmFsOyBcCisJZmMtPndyaXRlX2liaV9yZWcoZmMscmVnLHYpOyBcCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXNyYW0uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1zcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1NzBlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1zcmFtLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgdGhlIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIGZsZXhjb3Atc3JhbS5jIC0gZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgU1JBTS4KKyAqCisgKiBzZWUgZmxleGNvcC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKi8KKyNpbmNsdWRlICJmbGV4Y29wLmgiCisKK3N0YXRpYyB2b2lkIGZsZXhjb3Bfc3JhbV9zZXRfY2hpcCAoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9zcmFtX3R5cGVfdCB0eXBlKQoreworCWZsZXhjb3Bfc2V0X2liaV92YWx1ZSh3YW5fY3RybF9yZWdfNzFjLHNyYW1fY2hpcCx0eXBlKTsKK30KKworaW50IGZsZXhjb3Bfc3JhbV9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJc3dpdGNoIChmYy0+cmV2KSB7CisJCWNhc2UgRkxFWENPUF9JSToKKwkJY2FzZSBGTEVYQ09QX0lJQjoKKwkJCWZsZXhjb3Bfc3JhbV9zZXRfY2hpcChmYyxGQ19TUkFNXzFfMzJLQik7CisJCQlicmVhazsKKwkJY2FzZSBGTEVYQ09QX0lJSToKKwkJCWZsZXhjb3Bfc3JhbV9zZXRfY2hpcChmYyxGQ19TUkFNXzFfNDhLQik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZsZXhjb3Bfc3JhbV9zZXRfZGVzdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX3NyYW1fZGVzdF90IGRlc3QsIGZsZXhjb3Bfc3JhbV9kZXN0X3RhcmdldF90IHRhcmdldCkKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2OworCisJdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsc3JhbV9kZXN0X3JlZ183MTQpOworCisJaWYgKGZjLT5yZXYgIT0gRkxFWENPUF9JSUkgJiYgdGFyZ2V0ID09IEZDX1NSQU1fREVTVF9UQVJHRVRfRkMzX0NBKSB7CisJCWVycigiU1JBTSBkZXN0aW5hdGlvbiB0YXJnZXQgdG8gYXZhaWxhYmxlIG9uIEZsZXhDb3BJSShiKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlYl9zcmFtKCJzcmFtIGRlc3Q6ICV4IHRhcmdldDogJXhcbiIsZGVzdCwgdGFyZ2V0KTsKKworCWlmIChkZXN0ICYgRkNfU1JBTV9ERVNUX05FVCkKKwkJdi5zcmFtX2Rlc3RfcmVnXzcxNC5ORVRfRGVzdCA9IHRhcmdldDsKKwlpZiAoZGVzdCAmIEZDX1NSQU1fREVTVF9DQUkpCisJCXYuc3JhbV9kZXN0X3JlZ183MTQuQ0FJX0Rlc3QgPSB0YXJnZXQ7CisJaWYgKGRlc3QgJiBGQ19TUkFNX0RFU1RfQ0FPKQorCQl2LnNyYW1fZGVzdF9yZWdfNzE0LkNBT19EZXN0ID0gdGFyZ2V0OworCWlmIChkZXN0ICYgRkNfU1JBTV9ERVNUX01FRElBKQorCQl2LnNyYW1fZGVzdF9yZWdfNzE0Lk1FRElBX0Rlc3QgPSB0YXJnZXQ7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxzcmFtX2Rlc3RfcmVnXzcxNCx2KTsKKwl1ZGVsYXkoMTAwMCk7IC8qIFRPRE8gZGVsYXkgcmVhbGx5IG5lY2Vzc2FyeSAqLworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3Bfc3JhbV9zZXRfZGVzdCk7CisKK3ZvaWQgZmxleGNvcF93YW5fc2V0X3NwZWVkKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3Bfd2FuX3NwZWVkX3QgcykKK3sKKwlmbGV4Y29wX3NldF9pYmlfdmFsdWUod2FuX2N0cmxfcmVnXzcxYyx3YW5fc3BlZWRfc2lnLHMpOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX3dhbl9zZXRfc3BlZWQpOworCit2b2lkIGZsZXhjb3Bfc3JhbV9jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCB1c2Jfd2FuLCBpbnQgc3JhbWRtYSwgaW50IG1heGltdW1maWxsKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHNyYW1fZGVzdF9yZWdfNzE0KTsKKwl2LnNyYW1fZGVzdF9yZWdfNzE0LmN0cmxfdXNiX3dhbiA9IHVzYl93YW47CisJdi5zcmFtX2Rlc3RfcmVnXzcxNC5jdHJsX3NyYW1kbWEgPSBzcmFtZG1hOworCXYuc3JhbV9kZXN0X3JlZ183MTQuY3RybF9tYXhpbXVtZmlsbCA9IG1heGltdW1maWxsOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHNyYW1fZGVzdF9yZWdfNzE0LHYpOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX3NyYW1fY3RybCk7CisKKyNpZiAwCitzdGF0aWMgdm9pZCBmbGV4Y29wX3NyYW1fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlpbnQgaSwgcmV0cmllczsKKwl1MzIgY29tbWFuZDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljb21tYW5kID0gYmFuayB8IGFkZHIgfCAweDA0MDAwMDAwIHwgKCpidWYgPDwgMHgxMCk7CisKKwkJcmV0cmllcyA9IDI7CisKKwkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgeworCQkJbWRlbGF5KDEpOworCQkJcmV0cmllcy0tOworCQl9OworCisJCWlmIChyZXRyaWVzID09IDApCisJCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKKworCQlidWYrKzsKKwkJYWRkcisrOworCX0KK30KKworc3RhdGljIHZvaWQgZmxleF9zcmFtX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBiYW5rLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlpbnQgaSwgcmV0cmllczsKKwl1MzIgY29tbWFuZCwgdmFsdWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJY29tbWFuZCA9IGJhbmsgfCBhZGRyIHwgMHgwNDAwODAwMDsKKworCQlyZXRyaWVzID0gMTAwMDA7CisKKwkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgeworCQkJbWRlbGF5KDEpOworCQkJcmV0cmllcy0tOworCQl9OworCisJCWlmIChyZXRyaWVzID09IDApCisJCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwLCBjb21tYW5kKTsKKworCQlyZXRyaWVzID0gMTAwMDA7CisKKwkJd2hpbGUgKCgocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MDApICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJldHJpZXMgPiAwKSkgeworCQkJbWRlbGF5KDEpOworCQkJcmV0cmllcy0tOworCQl9OworCisJCWlmIChyZXRyaWVzID09IDApCisJCQlwcmludGsoIiVzOiBTUkFNIHRpbWVvdXRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJdmFsdWUgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgPj4gMHgxMDsKKworCQkqYnVmID0gKHZhbHVlICYgMHhmZik7CisKKwkJYWRkcisrOworCQlidWYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNyYW1fd3JpdGVfY2h1bmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQoreworCXUzMiBiYW5rOworCisJYmFuayA9IDA7CisKKwlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MjAwMDApIHsKKwkJYmFuayA9IChhZGRyICYgMHgxODAwMCkgPDwgMHgwZDsKKwl9CisKKwlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApIHsKKwkJaWYgKChhZGRyID4+IDB4MGYpID09IDApCisJCQliYW5rID0gMHgyMDAwMDAwMDsKKwkJZWxzZQorCQkJYmFuayA9IDB4MTAwMDAwMDA7CisJfQorCisJZmxleF9zcmFtX3dyaXRlKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgc3JhbV9yZWFkX2NodW5rKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKK3sKKwl1MzIgYmFuazsKKworCWJhbmsgPSAwOworCisJaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDIwMDAwKSB7CisJCWJhbmsgPSAoYWRkciAmIDB4MTgwMDApIDw8IDB4MGQ7CisJfQorCisJaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDAwMDAwKSB7CisJCWlmICgoYWRkciA+PiAweDBmKSA9PSAwKQorCQkJYmFuayA9IDB4MjAwMDAwMDA7CisJCWVsc2UKKwkJCWJhbmsgPSAweDEwMDAwMDAwOworCX0KKworCWZsZXhfc3JhbV9yZWFkKGFkYXB0ZXIsIGJhbmssIGFkZHIgJiAweDdmZmYsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgc3JhbV9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwl1MzIgbGVuZ3RoOworCisJd2hpbGUgKGxlbiAhPSAwKSB7CisJCWxlbmd0aCA9IGxlbjsKKworCQkvLyBjaGVjayBpZiB0aGUgYWRkcmVzcyByYW5nZSBiZWxvbmdzIHRvIHRoZSBzYW1lCisJCS8vIDMySyBtZW1vcnkgY2hpcC4gSWYgbm90LCB0aGUgZGF0YSBpcyByZWFkIGZyb20KKwkJLy8gb25lIGNoaXAgYXQgYSB0aW1lLgorCQlpZiAoKGFkZHIgPj4gMHgwZikgIT0gKChhZGRyICsgbGVuIC0gMSkgPj4gMHgwZikpIHsKKwkJCWxlbmd0aCA9ICgoKGFkZHIgPj4gMHgwZikgKyAxKSA8PCAweDBmKSAtIGFkZHI7CisJCX0KKworCQlzcmFtX3JlYWRfY2h1bmsoYWRhcHRlciwgYWRkciwgYnVmLCBsZW5ndGgpOworCisJCWFkZHIgPSBhZGRyICsgbGVuZ3RoOworCQlidWYgPSBidWYgKyBsZW5ndGg7CisJCWxlbiA9IGxlbiAtIGxlbmd0aDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNyYW1fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCXUzMiBsZW5ndGg7CisKKwl3aGlsZSAobGVuICE9IDApIHsKKwkJbGVuZ3RoID0gbGVuOworCisJCS8vIGNoZWNrIGlmIHRoZSBhZGRyZXNzIHJhbmdlIGJlbG9uZ3MgdG8gdGhlIHNhbWUKKwkJLy8gMzJLIG1lbW9yeSBjaGlwLiBJZiBub3QsIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8KKwkJLy8gb25lIGNoaXAgYXQgYSB0aW1lLgorCQlpZiAoKGFkZHIgPj4gMHgwZikgIT0gKChhZGRyICsgbGVuIC0gMSkgPj4gMHgwZikpIHsKKwkJCWxlbmd0aCA9ICgoKGFkZHIgPj4gMHgwZikgKyAxKSA8PCAweDBmKSAtIGFkZHI7CisJCX0KKworCQlzcmFtX3dyaXRlX2NodW5rKGFkYXB0ZXIsIGFkZHIsIGJ1ZiwgbGVuZ3RoKTsKKworCQlhZGRyID0gYWRkciArIGxlbmd0aDsKKwkJYnVmID0gYnVmICsgbGVuZ3RoOworCQlsZW4gPSBsZW4gLSBsZW5ndGg7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcmFtX3NldF9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaykKK3sKKwl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MWMsIChtYXNrIHwgKH4weDMwMDAwICYgcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpKSkpOworfQorCitzdGF0aWMgdm9pZCBzcmFtX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHRtcDsKKworCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjKTsKKworCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7CisKKwlpZiAocmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpICE9IDApIHsKKwkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCB0bXApOworCisJCWFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9IHRtcCAmIDB4MzAwMDA7CisKKwkJZGRwcmludGsoIiVzOiBkd19zcmFtX3R5cGUgPSAleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOworCisJfSBlbHNlIHsKKworCQlhZGFwdGVyLT5kd19zcmFtX3R5cGUgPSAweDEwMDAwOworCisJCWRkcHJpbnRrKCIlczogZHdfc3JhbV90eXBlID0gJXhcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZHdfc3JhbV90eXBlKTsKKwl9CisKKwkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KKy8qCXJldHVybiBhZGFwdGVyLT5kd19zcmFtX3R5cGU7ICovCit9CisKK3N0YXRpYyBpbnQgc3JhbV90ZXN0X2xvY2F0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaywgdTMyIGFkZHIpCit7CisJdTggdG1wMSwgdG1wMjsKKworCWRwcmludGsoIiVzOiBtYXNrID0gJXgsIGFkZHIgPSAleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrLCBhZGRyKTsKKworCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgbWFzayk7CisJc3JhbV9pbml0KGFkYXB0ZXIpOworCisJdG1wMiA9IDB4YTU7CisJdG1wMSA9IDB4NGY7CisKKwlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKKwlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7CisKKwl0bXAyID0gMDsKKworCW1kZWxheSgyMCk7CisKKwlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOworCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7CisKKwlkcHJpbnRrKCIlczogd3JvdGUgMHhhNSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKKworCWlmICh0bXAyICE9IDB4YTUpCisJCXJldHVybiAwOworCisJdG1wMiA9IDB4NWE7CisJdG1wMSA9IDB4ZjQ7CisKKwlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKKwlzcmFtX3dyaXRlKGFkYXB0ZXIsIGFkZHIgKyA0LCAmdG1wMSwgMSk7CisKKwl0bXAyID0gMDsKKworCW1kZWxheSgyMCk7CisKKwlzcmFtX3JlYWQoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOworCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7CisKKwlkcHJpbnRrKCIlczogd3JvdGUgMHg1YSwgcmVhZCAweCUyeFxuIiwgX19GVU5DVElPTl9fLCB0bXAyKTsKKworCWlmICh0bXAyICE9IDB4NWEpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1MzIgc3JhbV9sZW5ndGgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9PSAweDEwMDAwKQorCQlyZXR1cm4gMzI3Njg7CS8vICAzMksKKwlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApCisJCXJldHVybiA2NTUzNjsJLy8gIDY0SworCWlmIChhZGFwdGVyLT5kd19zcmFtX3R5cGUgPT0gMHgyMDAwMCkKKwkJcmV0dXJuIDEzMTA3MjsJLy8gMTI4SworCisJcmV0dXJuIDMyNzY4OwkJLy8gMzJLCit9CisKKy8qIEZsZXhjb3BJSSBjYW4gd29yayB3aXRoIDMySywgNjRLIG9yIDEyOEsgb2YgZXh0ZXJuYWwgU1JBTSBtZW1vcnkuCisgICAgLSBmb3IgMTI4SyB0aGVyZSBhcmUgNHgzMksgY2hpcHMgYXQgYmFuayAwLDEsMiwzLgorICAgIC0gZm9yICA2NEsgdGhlcmUgYXJlIDJ4MzJLIGNoaXBzIGF0IGJhbmsgMSwyLgorICAgIC0gZm9yICAzMksgdGhlcmUgaXMgb25lIDMySyBjaGlwIGF0IGJhbmsgMC4KKworICAgRmxleENvcCB3b3JrcyBvbmx5IHdpdGggb25lIGJhbmsgYXQgYSB0aW1lLiBUaGUgYmFuayBpcyBzZWxlY3RlZAorICAgYnkgYml0cyAyOC0yOSBvZiB0aGUgMHg3MDAgcmVnaXN0ZXIuCisKKyAgIGJhbmsgMCBjb3ZlcnMgYWRkcmVzc2VzIDB4MDAwMDAtMHgwN2ZmZgorICAgYmFuayAxIGNvdmVycyBhZGRyZXNzZXMgMHgwODAwMC0weDBmZmZmCisgICBiYW5rIDIgY292ZXJzIGFkZHJlc3NlcyAweDEwMDAwLTB4MTdmZmYKKyAgIGJhbmsgMyBjb3ZlcnMgYWRkcmVzc2VzIDB4MTgwMDAtMHgxZmZmZgorKi8KKworc3RhdGljIGludCBmbGV4Y29wX3NyYW1fZGV0ZWN0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgcjIwOCxyNzFjXzAsdnI3MWNfMTsKKworCXIyMDggPSBmYy0+cmVhZF9pYmlfcmVnKGZjLCBjdHJsXzIwOCk7CisJZmMtPndyaXRlX2liaV9yZWcoZmMsIGN0cmxfMjA4LCBpYmlfemVybyk7CisKKwlyNzFjXzAgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLCB3YW5fY3RybF9yZWdfNzFjKTsKKworCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgMSk7CisKKwl0bXAzID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOworCisJZHByaW50aygiJXM6IHRtcDMgPSAleFxuIiwgX19GVU5DVElPTl9fLCB0bXAzKTsKKworCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgdG1wMik7CisKKwkvLyBjaGVjayBmb3IgaW50ZXJuYWwgU1JBTSA/Pz8KKwl0bXAzLS07CisJaWYgKHRtcDMgIT0gMCkgeworCQlzcmFtX3NldF9zaXplKGFkYXB0ZXIsIDB4MTAwMDApOworCQlzcmFtX2luaXQoYWRhcHRlcik7CisJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKKworCQlkcHJpbnRrKCIlczogc3JhbSBzaXplID0gMzJLXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCXJldHVybiAzMjsKKwl9CisKKwlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MjAwMDAsIDB4MTgwMDApICE9IDApIHsKKwkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDIwMDAwKTsKKwkJc3JhbV9pbml0KGFkYXB0ZXIpOworCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7CisKKwkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDEyOEtcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJcmV0dXJuIDEyODsKKwl9CisKKwlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MDAwMDAsIDB4MTAwMDApICE9IDApIHsKKwkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDAwMDAwKTsKKwkJc3JhbV9pbml0KGFkYXB0ZXIpOworCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7CisKKwkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDY0S1xuIiwgX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gNjQ7CisJfQorCisJaWYgKHNyYW1fdGVzdF9sb2NhdGlvbihhZGFwdGVyLCAweDEwMDAwLCAweDAwMDAwKSAhPSAwKSB7CisJCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7CisJCXNyYW1faW5pdChhZGFwdGVyKTsKKwkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCB0bXApOworCisJCWRwcmludGsoIiVzOiBzcmFtIHNpemUgPSAzMktcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJcmV0dXJuIDMyOworCX0KKworCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7CisJc3JhbV9pbml0KGFkYXB0ZXIpOworCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKKworCWRwcmludGsoIiVzOiBTUkFNIGRldGVjdGlvbiBmYWlsZWQuIFNldCB0byAzMksgXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNsbF9kZXRlY3Rfc3JhbV9zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXNyYW1fZGV0ZWN0X2Zvcl9mbGV4MihhZGFwdGVyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExMzQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwpAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpbnV4IGRyaXZlciB0aGUgZGlnaXRhbCBUViBkZXZpY2VzIGVxdWlwcGVkIHdpdGggQjJDMiBGbGV4Y29wSUkoYikvSUlJCisgKgorICogZmxleGNvcC11c2IuYyAtIGNvdmVycyB0aGUgVVNCIHBhcnQuCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKyNkZWZpbmUgRkNfTE9HX1BSRUZJWCAiZmxleGNvcF91c2IiCisjaW5jbHVkZSAiZmxleGNvcC11c2IuaCIKKyNpbmNsdWRlICJmbGV4Y29wLWNvbW1vbi5oIgorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjEiCisjZGVmaW5lIERSSVZFUl9OQU1FICJUZWNobmlzYXQvQjJDMiBGbGV4Q29wIElJL0lJYi9JSUkgRGlnaXRhbCBUViBVU0IgRHJpdmVyIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iCisKKy8qIGRlYnVnICovCisjaWZkZWYgQ09ORklHX0RWQl9CMkMyX0ZMRVhDT1BfREVCVUcKKyNkZWZpbmUgZHByaW50ayhsZXZlbCxhcmdzLi4uKSBcCisJICAgIGRvIHsgaWYgKChkZWJ1ZyAmIGxldmVsKSkgeyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfZHVtcChiLGwsbWV0aG9kKSB7XAorCWludCBpOyBcCisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykgbWV0aG9kKCIlMDJ4ICIsIGJbaV0pOyBcCisJbWV0aG9kKCJcbiIpO1wKK30KKworI2RlZmluZSBERUJTVEFUVVMgIiIKKyNlbHNlCisjZGVmaW5lIGRwcmludGsobGV2ZWwsYXJncy4uLikKKyNkZWZpbmUgZGVidWdfZHVtcChiLGwsbWV0aG9kKQorI2RlZmluZSBERUJTVEFUVVMgIiAoZGVidWdnaW5nIGlzIG5vdCBlbmFibGVkKSIKKyNlbmRpZgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyx0cz0yLGN0cmw9NCxpMmM9OCx2OG1lbT0xNiAob3ItYWJsZSkpLiIgREVCU1RBVFVTKTsKKyN1bmRlZiBERUJTVEFUVVMKKworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKDB4MDEsYXJncykKKyNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgZHByaW50aygweDAyLGFyZ3MpCisjZGVmaW5lIGRlYl9jdHJsKGFyZ3MuLi4pIGRwcmludGsoMHgwNCxhcmdzKQorI2RlZmluZSBkZWJfaTJjKGFyZ3MuLi4pICBkcHJpbnRrKDB4MDgsYXJncykKKyNkZWZpbmUgZGViX3Y4KGFyZ3MuLi4pICAgZHByaW50aygweDEwLGFyZ3MpCisKKy8qIEpMUCAxMTE3MDA6IHdlIHdpbGwgaW5jbHVkZSB0aGUgMSBiaXQgZ2FwIGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciAzIGJpdHMKKyAqIGluIHRoZSBJQkkgYWRkcmVzcywgdG8gbWFrZSB0aGUgVjggY29kZSBzaW1wbGVyLgorICogUENJIEFERFJFU1MgRk9STUFUOiAweDcxQyAtPiAwMDAwIDAxMTEgMDAwMSAxMTAwICh0aGVzZSBhcmUgdGhlIHNpeCBiaXRzIHVzZWQpCisgKiAgICAgICAgICAgICAgICAgIGluIGdlbmVyYWw6IDAwMDAgMEhISCAwMDBMIExMMDAKKyAqIElCSSBBRERSRVNTIEZPUk1BVDogICAgICAgICAgICAgICAgICAgIFJISEggQkxMTAorICoKKyAqIHdoZXJlIFIgaXMgdGhlIHJlYWQoMSkvd3JpdGUoMCkgYml0LCBCIGlzIHRoZSBidXN5IGJpdAorICogYW5kIEhISCBhbmQgTExMIGFyZSB0aGUgdHdvIHNldHMgb2YgdGhyZWUgYml0cyBmcm9tIHRoZSBQQ0kgYWRkcmVzcy4KKyAqLworI2RlZmluZSBCMkMyX0ZMRVhfUENJT0ZGU0VUX1RPX0lOVEVSTkFMQUREUih1c1BDSSkgKHU4KSAoKCh1c1BDSSA+PiAyKSAmIDB4MDcpICsgKCh1c1BDSSA+PiA0KSAmIDB4NzApKQorI2RlZmluZSBCMkMyX0ZMRVhfSU5URVJOQUxBRERSX1RPX1BDSU9GRlNFVCh1Y0FkZHIpICh1MTYpICgoKHVjQWRkciAmIDB4MDcpIDw8IDIpICsgKCh1Y0FkZHIgJiAweDcwKSA8PCA0KSkKKworLyoKKyAqIERLVCAwMjAyMjgKKyAqIC0gZm9yZ2V0IGFib3V0IHRoaXMgVkVORE9SX0JVRkZFUl9TSVpFLCByZWFkIGFuZCB3cml0ZSByZWdpc3RlcgorICogICBkZWFsIHdpdGggRFdPUkQgb3IgNCBieXRlcywgdGhhdCBzaG91bGQgYmUgc2hvdWxkIGZyb20gbm93IG9uCisgKiAtIGZyb20gbm93IG9uLCB3ZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG9sZGVyIHRoYW4gZmlybSAxLjAwCisgKiAgIEkgZWxpbWluYXRlZCB0aGUgd3JpdGUgcmVnaXN0ZXIgYXMgYSAyIHRyaXAgb2Ygd3JpdGluZyBoaSB3b3JkIGFuZCBsbyB3b3JkCisgKiAgIGFuZCBmb3JjZSB0aGlzIHRvIHdyaXRlIG9ubHkgNCBieXRlcyBhdCBhIHRpbWUuCisgKiAgIE5PVEU6IHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBhbGwgdGhlIGZpcm13YXJlIGZyb20gMS4wMCBhbmQgbmV3ZXIKKyAqLworc3RhdGljIGludCBmbGV4Y29wX3VzYl9yZWFkd3JpdGVfZHcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgdTE2IHdSZWdPZmZzUENJLCB1MzIgKnZhbCwgdTggcmVhZCkKK3sKKwlzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYiA9IGZjLT5idXNfc3BlY2lmaWM7CisJdTggcmVxdWVzdCA9IHJlYWQgPyBCMkMyX1VTQl9SRUFEX1JFRyA6IEIyQzJfVVNCX1dSSVRFX1JFRzsKKwl1OCByZXF1ZXN0X3R5cGUgPSAocmVhZCA/IFVTQl9ESVJfSU4gOiBVU0JfRElSX09VVCkgfCBVU0JfVFlQRV9WRU5ET1I7CisJdTggd0FkZHJlc3MgPSBCMkMyX0ZMRVhfUENJT0ZGU0VUX1RPX0lOVEVSTkFMQUREUih3UmVnT2Zmc1BDSSkgfCAocmVhZCA/IDB4ODAgOiAwKTsKKworCWludCBsZW4gPSB1c2JfY29udHJvbF9tc2coZmNfdXNiLT51ZGV2LAorCQkJcmVhZCA/IEIyQzJfVVNCX0NUUkxfUElQRV9JTiA6IEIyQzJfVVNCX0NUUkxfUElQRV9PVVQsCisJCQlyZXF1ZXN0LAorCQkJcmVxdWVzdF90eXBlLCAgLyogMHhjMCByZWFkIG9yIDB4NDAgd3JpdGUqLworCQkJd0FkZHJlc3MsCisJCQkwLAorCQkJdmFsLAorCQkJc2l6ZW9mKHUzMiksCisJCQlCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9SRFcgKiBIWik7CisKKwlpZiAobGVuICE9IHNpemVvZih1MzIpKSB7CisJCWVycigiZXJyb3Igd2hpbGUgJXMgZHdvcmQgZnJvbSAlZCAoJWQpLiIscmVhZCA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkJCXdBZGRyZXNzLHdSZWdPZmZzUENJKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKgorICogREtUIDAxMDgxNyAtIGFkZCBzdXBwb3J0IGZvciBWOCBtZW1vcnkgcmVhZC93cml0ZSBhbmQgZmxhc2ggdXBkYXRlCisgKi8KK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfdjhfbWVtb3J5X3JlcShzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYiwKKwkJZmxleGNvcF91c2JfcmVxdWVzdF90IHJlcSwgdTggcGFnZSwgdTE2IHdBZGRyZXNzLAorCQl1OCAqcGJCdWZmZXIsdTMyIGJ1ZmxlbikKK3sKKy8vCXU4IGR3UmVxdWVzdFR5cGU7CisJdTggcmVxdWVzdF90eXBlID0gVVNCX1RZUEVfVkVORE9SOworCXUxNiB3SW5kZXg7CisJaW50IG5XYWl0VGltZSxwaXBlLGxlbjsKKworCXdJbmRleCA9IHBhZ2UgPDwgODsKKworCXN3aXRjaCAocmVxKSB7CisJCWNhc2UgQjJDMl9VU0JfUkVBRF9WOF9NRU06CisJCQluV2FpdFRpbWUgPSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9WOFJFQUQ7CisJCQlyZXF1ZXN0X3R5cGUgfD0gVVNCX0RJUl9JTjsKKy8vCQkJZHdSZXF1ZXN0VHlwZSA9ICh1OCkgUlRZUEVfUkVBRF9WOF9NRU1PUlk7CisJCQlwaXBlID0gQjJDMl9VU0JfQ1RSTF9QSVBFX0lOOworCQlicmVhazsKKwkJY2FzZSBCMkMyX1VTQl9XUklURV9WOF9NRU06CisJCQl3SW5kZXggfD0gcGJCdWZmZXJbMF07CisJCQlyZXF1ZXN0X3R5cGUgfD0gVVNCX0RJUl9PVVQ7CisJCQluV2FpdFRpbWUgPSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9WOFdSSVRFOworLy8JCQlkd1JlcXVlc3RUeXBlID0gKHU4KSBSVFlQRV9XUklURV9WOF9NRU1PUlk7CisJCQlwaXBlID0gQjJDMl9VU0JfQ1RSTF9QSVBFX09VVDsKKwkJYnJlYWs7CisJCWNhc2UgQjJDMl9VU0JfRkxBU0hfQkxPQ0s6CisJCQlyZXF1ZXN0X3R5cGUgfD0gVVNCX0RJUl9PVVQ7CisJCQluV2FpdFRpbWUgPSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9WOEZMQVNIOworLy8JCQlkd1JlcXVlc3RUeXBlID0gKHU4KSBSVFlQRV9XUklURV9WOF9GTEFTSDsKKwkJCXBpcGUgPSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlYl9pbmZvKCJ1bnN1cHBvcnRlZCByZXF1ZXN0IGZvciB2OF9tZW1fcmVxICV4LlxuIixyZXEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGViX3Y4KCJ2OG1lbTogJTAyeCAlMDJ4ICUwNHggJTA0eCwgbGVuOiAlZFxuIixyZXF1ZXN0X3R5cGUscmVxLAorCQkJd0FkZHJlc3Msd0luZGV4LGJ1Zmxlbik7CisKKwlsZW4gPSB1c2JfY29udHJvbF9tc2coZmNfdXNiLT51ZGV2LHBpcGUsCisJCQlyZXEsCisJCQlyZXF1ZXN0X3R5cGUsCisJCQl3QWRkcmVzcywKKwkJCXdJbmRleCwKKwkJCXBiQnVmZmVyLAorCQkJYnVmbGVuLAorCQkJbldhaXRUaW1lICogSFopOworCisJZGVidWdfZHVtcChwYkJ1ZmZlcixsZW4sZGViX3Y4KTsKKworCXJldHVybiBsZW4gPT0gYnVmbGVuID8gMCA6IC1FSU87Cit9CisKKyNkZWZpbmUgYnl0ZXNfbGVmdF90b19yZWFkX29uX3BhZ2UocGFkZHIsYnVmbGVuKSBcCisJCQkoKFY4X01FTU9SWV9QQUdFX1NJWkUgLSAocGFkZHIgJiBWOF9NRU1PUllfUEFHRV9NQVNLKSkgPiBidWZsZW4gXAorCQkJPyBidWZsZW4gOiAoVjhfTUVNT1JZX1BBR0VfU0laRSAtIChwYWRkciAmIFY4X01FTU9SWV9QQUdFX01BU0spKSkKKworc3RhdGljIGludCBmbGV4Y29wX3VzYl9tZW1vcnlfcmVxKHN0cnVjdCBmbGV4Y29wX3VzYiAqZmNfdXNiLGZsZXhjb3BfdXNiX3JlcXVlc3RfdCByZXEsCisJCWZsZXhjb3BfdXNiX21lbV9wYWdlX3QgcGFnZV9zdGFydCwgdTMyIGFkZHIsIGludCBleHRlbmRlZCwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlpbnQgaSxyZXQgPSAwOworCXUxNiB3TWF4OworCXUzMiBwYWdlY2h1bmsgPSAwOworCisJc3dpdGNoKHJlcSkgeworCQljYXNlIEIyQzJfVVNCX1JFQURfVjhfTUVNOiAgd01heCA9IFVTQl9NRU1fUkVBRF9NQVg7IGJyZWFrOworCQljYXNlIEIyQzJfVVNCX1dSSVRFX1Y4X01FTToJd01heCA9IFVTQl9NRU1fV1JJVEVfTUFYOyBicmVhazsKKwkJY2FzZSBCMkMyX1VTQl9GTEFTSF9CTE9DSzogIHdNYXggPSBVU0JfRkxBU0hfTUFYOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJZm9yIChpID0gMDsgaSA8IGxlbjspIHsKKwkJcGFnZWNodW5rID0gd01heCA8IGJ5dGVzX2xlZnRfdG9fcmVhZF9vbl9wYWdlKGFkZHIsbGVuKSA/IHdNYXggOiBieXRlc19sZWZ0X3RvX3JlYWRfb25fcGFnZShhZGRyLGxlbik7CisJCWRlYl9pbmZvKCIleFxuIiwoYWRkciAmIFY4X01FTU9SWV9QQUdFX01BU0spIHwgKFY4X01FTU9SWV9FWFRFTkRFRCpleHRlbmRlZCkpOworCQlpZiAoKHJldCA9IGZsZXhjb3BfdXNiX3Y4X21lbW9yeV9yZXEoZmNfdXNiLHJlcSwKKwkJCQlwYWdlX3N0YXJ0ICsgKGFkZHIgLyBWOF9NRU1PUllfUEFHRV9TSVpFKSwgLyogYWN0dWFsIHBhZ2UgKi8KKwkJCQkoYWRkciAmIFY4X01FTU9SWV9QQUdFX01BU0spIHwgKFY4X01FTU9SWV9FWFRFTkRFRCpleHRlbmRlZCksCisJCQkJJmJ1ZltpXSxwYWdlY2h1bmspKSA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWFkZHIgKz0gcGFnZWNodW5rOworCQlsZW4gLT0gcGFnZWNodW5rOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3VzYl9nZXRfbWFjX2FkZHIoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgaW50IGV4dGVuZGVkKQoreworCXJldHVybiBmbGV4Y29wX3VzYl9tZW1vcnlfcmVxKGZjLT5idXNfc3BlY2lmaWMsQjJDMl9VU0JfUkVBRF9WOF9NRU0sCisJCQlWOF9NRU1PUllfUEFHRV9GTEFTSCwweDFmMDEwLDEsZmMtPmR2Yl9hZGFwdGVyLnByb3Bvc2VkX21hYyw2KTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfdXRpbGl0eV9yZXEoc3RydWN0IGZsZXhjb3BfdXNiICpmY191c2IsIGludCBzZXQsCisJCWZsZXhjb3BfdXNiX3V0aWxpdHlfZnVuY3Rpb25fdCBmdW5jLCB1OCBleHRyYSwgdTE2IHdJbmRleCwKKwkJdTE2IGJ1ZmxlbiwgdTggKnB2QnVmZmVyKQoreworCXUxNiB3VmFsdWU7CisJdTggcmVxdWVzdF90eXBlID0gKHNldCA/IFVTQl9ESVJfT1VUIDogVVNCX0RJUl9JTikgfCBVU0JfVFlQRV9WRU5ET1I7CisvLwl1OCBkd1JlcXVlc3RUeXBlID0gKHU4KSBSVFlQRV9HRU5FUklDLAorCWludCBuV2FpdFRpbWUgPSAyLAorCQlwaXBlID0gc2V0ID8gQjJDMl9VU0JfQ1RSTF9QSVBFX09VVCA6IEIyQzJfVVNCX0NUUkxfUElQRV9JTiwKKwkJbGVuOworCisJd1ZhbHVlID0gKGZ1bmMgPDwgOCkgfCBleHRyYTsKKworCWxlbiA9IHVzYl9jb250cm9sX21zZyhmY191c2ItPnVkZXYscGlwZSwKKwkJCUIyQzJfVVNCX1VUSUxJVFksCisJCQlyZXF1ZXN0X3R5cGUsCisJCQl3VmFsdWUsCisJCQl3SW5kZXgsCisJCQlwdkJ1ZmZlciwKKwkJCWJ1ZmxlbiwKKwkJCW5XYWl0VGltZSAqIEhaKTsKKwlyZXR1cm4gbGVuID09IGJ1ZmxlbiA/IDAgOiAtRUlPOworfQorI2VuZGlmCisKKy8qIHVzYiBpMmMgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfaTJjX3JlcShzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYiwKKwkJZmxleGNvcF91c2JfcmVxdWVzdF90IHJlcSwgZmxleGNvcF91c2JfaTJjX2Z1bmN0aW9uX3QgZnVuYywKKwkJZmxleGNvcF9pMmNfcG9ydF90IHBvcnQsIHU4IGNoaXBhZGRyLCB1OCBhZGRyLCB1OCAqYnVmLCB1OCBidWZsZW4pCit7CisJdTE2IHdWYWx1ZSwgd0luZGV4OworCWludCBuV2FpdFRpbWUscGlwZSxsZW47CisvLwl1OCBkd1JlcXVlc3RUeXBlOworCXU4IHJlcXVlc3RfdHlwZSA9IFVTQl9UWVBFX1ZFTkRPUjsKKworCXN3aXRjaCAoZnVuYykgeworCQljYXNlIFVTQl9GVU5DX0kyQ19XUklURToKKwkJY2FzZSBVU0JfRlVOQ19JMkNfTVVMVElXUklURToKKwkJY2FzZSBVU0JfRlVOQ19JMkNfUkVQRUFUV1JJVEU6CisJCS8qIERLVCAwMjAyMDggLSBhZGQgdGhpcyB0byBzdXBwb3J0IHNwZWNpYWwgY2FzZSBvZiBEaVNFcUMgKi8KKwkJY2FzZSBVU0JfRlVOQ19JMkNfQ0hFQ0tXUklURToKKwkJCXBpcGUgPSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUOworCQkJbldhaXRUaW1lID0gMjsKKy8vCQkJZHdSZXF1ZXN0VHlwZSA9ICh1OCkgUlRZUEVfR0VORVJJQzsKKwkJCXJlcXVlc3RfdHlwZSB8PSBVU0JfRElSX09VVDsKKwkJYnJlYWs7CisJCWNhc2UgVVNCX0ZVTkNfSTJDX1JFQUQ6CisJCWNhc2UgVVNCX0ZVTkNfSTJDX1JFUEVBVFJFQUQ6CisJCQlwaXBlID0gQjJDMl9VU0JfQ1RSTF9QSVBFX0lOOworCQkJbldhaXRUaW1lID0gMjsKKy8vCQkJZHdSZXF1ZXN0VHlwZSA9ICh1OCkgUlRZUEVfR0VORVJJQzsKKwkJCXJlcXVlc3RfdHlwZSB8PSBVU0JfRElSX0lOOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlYl9pbmZvKCJ1bnN1cHBvcnRlZCBmdW5jdGlvbiBmb3IgaTJjX3JlcSAleFxuIixmdW5jKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwl3VmFsdWUgPSAoZnVuYyA8PCA4ICkgfCAocG9ydCA8PCA0KTsKKwl3SW5kZXggPSAoY2hpcGFkZHIgPDwgOCApIHwgYWRkcjsKKworCWRlYl9pMmMoImkyYyAlMmQ6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLGZ1bmMscmVxdWVzdF90eXBlLHJlcSwKKwkJCSgod1ZhbHVlICYmIDB4ZmYpIDw8IDgpLHdWYWx1ZSA+PiA4LCgod0luZGV4ICYmIDB4ZmYpIDw8IDgpLHdJbmRleCA+PiA4KTsKKworCWxlbiA9IHVzYl9jb250cm9sX21zZyhmY191c2ItPnVkZXYscGlwZSwKKwkJCXJlcSwKKwkJCXJlcXVlc3RfdHlwZSwKKwkJCXdWYWx1ZSwKKwkJCXdJbmRleCwKKwkJCWJ1ZiwKKwkJCWJ1ZmxlbiwKKwkJCW5XYWl0VGltZSAqIEhaKTsKKworCXJldHVybiBsZW4gPT0gYnVmbGVuID8gMCA6IC1FUkVNT1RFSU87Cit9CisKKy8qIGFjdHVhbCBidXMgc3BlY2lmaWMgYWNjZXNzIGZ1bmN0aW9ucywgbWFrZSBzdXJlIHByb3RvdHlwZSBhcmUvd2lsbCBiZSBlcXVhbCB0byBwY2kgKi8KK3N0YXRpYyBmbGV4Y29wX2liaV92YWx1ZSBmbGV4Y29wX3VzYl9yZWFkX2liaV9yZWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9pYmlfcmVnaXN0ZXIgcmVnKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHZhbDsKKwl2YWwucmF3ID0gMDsKKwlmbGV4Y29wX3VzYl9yZWFkd3JpdGVfZHcoZmMscmVnLCAmdmFsLnJhdywgMSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3VzYl93cml0ZV9pYmlfcmVnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3JlZ2lzdGVyIHJlZywgZmxleGNvcF9pYmlfdmFsdWUgdmFsKQoreworCXJldHVybiBmbGV4Y29wX3VzYl9yZWFkd3JpdGVfZHcoZmMscmVnLCAmdmFsLnJhdywgMCk7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfaTJjX3JlcXVlc3Qoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9hY2Nlc3Nfb3BfdCBvcCwKKwkJZmxleGNvcF9pMmNfcG9ydF90IHBvcnQsIHU4IGNoaXBhZGRyLCB1OCBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQoreworCWlmIChvcCA9PSBGQ19SRUFEKQorCQlyZXR1cm4gZmxleGNvcF91c2JfaTJjX3JlcShmYy0+YnVzX3NwZWNpZmljLEIyQzJfVVNCX0kyQ19SRVFVRVNULFVTQl9GVU5DX0kyQ19SRUFELHBvcnQsY2hpcGFkZHIsYWRkcixidWYsbGVuKTsKKwllbHNlCisJCXJldHVybiBmbGV4Y29wX3VzYl9pMmNfcmVxKGZjLT5idXNfc3BlY2lmaWMsQjJDMl9VU0JfSTJDX1JFUVVFU1QsVVNCX0ZVTkNfSTJDX1dSSVRFLHBvcnQsY2hpcGFkZHIsYWRkcixidWYsbGVuKTsKK30KKworc3RhdGljIHZvaWQgZmxleGNvcF91c2JfcHJvY2Vzc19mcmFtZShzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYiwgdTggKmJ1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgpCit7CisJdTggKmI7CisJaW50IGw7CisKKwlkZWJfdHMoInRtcF9idWZmZXJfbGVuZ3RoPSVkLCBidWZmZXJfbGVuZ3RoPSVkXG4iLCBmY191c2ItPnRtcF9idWZmZXJfbGVuZ3RoLCBidWZmZXJfbGVuZ3RoKTsKKworCWlmIChmY191c2ItPnRtcF9idWZmZXJfbGVuZ3RoID4gMCkgeworCQltZW1jcHkoZmNfdXNiLT50bXBfYnVmZmVyK2ZjX3VzYi0+dG1wX2J1ZmZlcl9sZW5ndGgsIGJ1ZmZlciwgYnVmZmVyX2xlbmd0aCk7CisJCWZjX3VzYi0+dG1wX2J1ZmZlcl9sZW5ndGggKz0gYnVmZmVyX2xlbmd0aDsKKwkJYiA9IGZjX3VzYi0+dG1wX2J1ZmZlcjsKKwkJbCA9IGZjX3VzYi0+dG1wX2J1ZmZlcl9sZW5ndGg7CisJfSBlbHNlIHsKKwkJYj1idWZmZXI7CisJCWw9YnVmZmVyX2xlbmd0aDsKKwl9CisKKwl3aGlsZSAobCA+PSAxOTApIHsKKwkJaWYgKCpiID09IDB4ZmYpCisJCQlzd2l0Y2ggKCooYisxKSAmIDB4MDMpIHsKKwkJCQljYXNlIDB4MDE6IC8qIG1lZGlhIHBhY2tldCAqLworCQkJCQlpZiAoICooYisyKSA9PSAweDQ3ICkKKwkJCQkJCWZsZXhjb3BfcGFzc19kbXhfcGFja2V0cyhmY191c2ItPmZjX2RldiwgYisyLCAxKTsKKwkJCQkJZWxzZQorCQkJCQkJZGViX3RzKCJub3QgdHMgcGFja2V0ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCAqKGIrMiksICooYiszKSwgKihiKzQpLCAqKGIrNSkgKTsKKworCQkJCQliICs9IDE5MDsKKwkJCQkJbCAtPSAxOTA7CisJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGViX3RzKCJ3cm9uZyBwYWNrZXQgdHlwZVxuIik7CisJCQkJCWwgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQllbHNlIHsKKwkJCWRlYl90cygid3JvbmcgaGVhZGVyXG4iKTsKKwkJCWwgPSAwOworCQl9CisJfQorCisJaWYgKGw+MCkKKwkJbWVtY3B5KGZjX3VzYi0+dG1wX2J1ZmZlciwgYiwgbCk7CisJZmNfdXNiLT50bXBfYnVmZmVyX2xlbmd0aCA9IGw7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfdXNiX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IGZsZXhjb3BfdXNiICpmY191c2IgPSB1cmItPmNvbnRleHQ7CisJaW50IGk7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKKwkJZGViX3RzKCJ1cmIgY29tcGxldGVkLCBidWZzaXplOiAlZCBhY3RsZW47ICVkXG4iLHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzIDwgMCkgeworCQkJZXJyKCJpc28gZnJhbWUgZGVzY3JpcHRvciAlZCBoYXMgYW4gZXJyb3I6ICVkXG4iLGksdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpOworCQl9IGVsc2UKKwkJCWlmICh1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCQkJZGViX3RzKCJwYXNzZWQgJWQgYnl0ZXMgdG8gdGhlIGRlbXV4XG4iLHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCk7CisKKwkJCQlmbGV4Y29wX3VzYl9wcm9jZXNzX2ZyYW1lKGZjX3VzYiwKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCwKKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoKTsKKwkJfQorCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IDA7CisJfQorCisJdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgaW50IGZsZXhjb3BfdXNiX3N0cmVhbV9jb250cm9sKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBvbm9mZikKK3sKKwkvKiBzdWJtaXQva2lsbCBpc28gcGFja2V0cyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmbGV4Y29wX3VzYl90cmFuc2Zlcl9leGl0KHN0cnVjdCBmbGV4Y29wX3VzYiAqZmNfdXNiKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBCMkMyX1VTQl9OVU1fSVNPX1VSQjsgaSsrKQorCQlpZiAoZmNfdXNiLT5pc29fdXJiW2ldICE9IE5VTEwpIHsKKwkJCWRlYl90cygidW5saW5raW5nL2tpbGxpbmcgdXJiIG5vLiAlZFxuIixpKTsKKwkJCXVzYl9raWxsX3VyYihmY191c2ItPmlzb191cmJbaV0pOworCQkJdXNiX2ZyZWVfdXJiKGZjX3VzYi0+aXNvX3VyYltpXSk7CisJCX0KKworCWlmIChmY191c2ItPmlzb19idWZmZXIgIT0gTlVMTCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChOVUxMLGZjX3VzYi0+YnVmZmVyX3NpemUsIGZjX3VzYi0+aXNvX2J1ZmZlciwgZmNfdXNiLT5kbWFfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfdHJhbnNmZXJfaW5pdChzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYikKK3sKKwl1MTYgZnJhbWVfc2l6ZSA9IGZjX3VzYi0+dWludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjLndNYXhQYWNrZXRTaXplOworCWludCBidWZzaXplID0gQjJDMl9VU0JfTlVNX0lTT19VUkIgKiBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTyAqIGZyYW1lX3NpemUsaSxqLHJldDsKKwlpbnQgYnVmZmVyX29mZnNldCA9IDA7CisKKwlkZWJfdHMoImNyZWF0aW5nICVkIGlzby11cmJzIHdpdGggJWQgZnJhbWVzIGVhY2ggb2YgJWQgYnl0ZXMgc2l6ZSA9ICVkLlxuIiwKKwkJCUIyQzJfVVNCX05VTV9JU09fVVJCLCBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTywgZnJhbWVfc2l6ZSxidWZzaXplKTsKKworCWZjX3VzYi0+aXNvX2J1ZmZlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KE5VTEwsYnVmc2l6ZSwmZmNfdXNiLT5kbWFfYWRkcik7CisJaWYgKGZjX3VzYi0+aXNvX2J1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmNfdXNiLT5pc29fYnVmZmVyLCAwLCBidWZzaXplKTsKKwlmY191c2ItPmJ1ZmZlcl9zaXplID0gYnVmc2l6ZTsKKworCS8qIGNyZWF0aW5nIGlzbyB1cmJzICovCisJZm9yIChpID0gMDsgaSA8IEIyQzJfVVNCX05VTV9JU09fVVJCOyBpKyspCisJCWlmICghKGZjX3VzYi0+aXNvX3VyYltpXSA9IHVzYl9hbGxvY191cmIoQjJDMl9VU0JfRlJBTUVTX1BFUl9JU08sR0ZQX0FUT01JQykpKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byB1cmJfZXJyb3I7CisJCX0KKwkvKiBpbml0aWFsaXNpbmcgYW5kIHN1Ym1pdHRpbmcgaXNvIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQjJDMl9VU0JfTlVNX0lTT19VUkI7IGkrKykgeworCQlpbnQgZnJhbWVfb2Zmc2V0ID0gMDsKKwkJc3RydWN0IHVyYiAqdXJiID0gZmNfdXNiLT5pc29fdXJiW2ldOworCQlkZWJfdHMoImluaXRpYWxpemluZyBhbmQgc3VibWl0dGluZyB1cmIgbm8uICVkIChidWZfb2Zmc2V0OiAlZCkuXG4iLGksYnVmZmVyX29mZnNldCk7CisKKwkJdXJiLT5kZXYgPSBmY191c2ItPnVkZXY7CisJCXVyYi0+Y29udGV4dCA9IGZjX3VzYjsKKwkJdXJiLT5jb21wbGV0ZSA9IGZsZXhjb3BfdXNiX3VyYl9jb21wbGV0ZTsKKwkJdXJiLT5waXBlID0gQjJDMl9VU0JfREFUQV9QSVBFOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPmludGVydmFsID0gMTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEIyQzJfVVNCX0ZSQU1FU19QRVJfSVNPOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBmcmFtZV9zaXplICogQjJDMl9VU0JfRlJBTUVTX1BFUl9JU087CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gZmNfdXNiLT5pc29fYnVmZmVyICsgYnVmZmVyX29mZnNldDsKKworCQlidWZmZXJfb2Zmc2V0ICs9IGZyYW1lX3NpemUgKiBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTzsKKwkJZm9yIChqID0gMDsgaiA8IEIyQzJfVVNCX0ZSQU1FU19QRVJfSVNPOyBqKyspIHsKKwkJCWRlYl90cygidXJiIG5vOiAlZCwgZnJhbWU6ICVkLCBmcmFtZV9vZmZzZXQ6ICVkXG4iLGksaixmcmFtZV9vZmZzZXQpOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBmcmFtZV9vZmZzZXQ7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IGZyYW1lX3NpemU7CisJCQlmcmFtZV9vZmZzZXQgKz0gZnJhbWVfc2l6ZTsKKwkJfQorCisJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIoZmNfdXNiLT5pc29fdXJiW2ldLEdGUF9BVE9NSUMpKSkgeworCQkJZXJyKCJzdWJtaXR0aW5nIHVyYiAlZCBmYWlsZWQgd2l0aCAlZC4iLGkscmV0KTsKKwkJCWdvdG8gdXJiX2Vycm9yOworCQl9CisJCWRlYl90cygic3VibWl0dGVkIHVyYiBuby4gJWQuXG4iLGkpOworCX0KKworLyogU1JBTSAqLworCisJZmxleGNvcF9zcmFtX3NldF9kZXN0KGZjX3VzYi0+ZmNfZGV2LEZDX1NSQU1fREVTVF9NRURJQSB8IEZDX1NSQU1fREVTVF9ORVQgfAorCQkJRkNfU1JBTV9ERVNUX0NBTyB8IEZDX1NSQU1fREVTVF9DQUksIEZDX1NSQU1fREVTVF9UQVJHRVRfV0FOX1VTQik7CisJZmxleGNvcF93YW5fc2V0X3NwZWVkKGZjX3VzYi0+ZmNfZGV2LEZDX1dBTl9TUEVFRF84TUJJVFMpOworCWZsZXhjb3Bfc3JhbV9jdHJsKGZjX3VzYi0+ZmNfZGV2LDEsMSwxKTsKKworCXJldCA9IDA7CisJZ290byBzdWNjZXNzOwordXJiX2Vycm9yOgorCWZsZXhjb3BfdXNiX3RyYW5zZmVyX2V4aXQoZmNfdXNiKTsKK3N1Y2Nlc3M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmbGV4Y29wX3VzYl9pbml0KHN0cnVjdCBmbGV4Y29wX3VzYiAqZmNfdXNiKQoreworCS8qIHVzZSB0aGUgYWx0ZXJuYXRlIHNldHRpbmcgd2l0aCB0aGUgbGFyZ2VzIGJ1ZmZlciAqLworCXVzYl9zZXRfaW50ZXJmYWNlKGZjX3VzYi0+dWRldiwwLDEpOworCXN3aXRjaCAoZmNfdXNiLT51ZGV2LT5zcGVlZCkgeworCQljYXNlIFVTQl9TUEVFRF9MT1c6CisJCQllcnIoImNhbm5vdCBoYW5kbGUgVVNCIHNwZWVkIGJlY2F1c2UgaXQgaXMgdG8gc0xPVy4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCQlpbmZvKCJydW5uaW5nIGF0IEZVTEwgc3BlZWQuIik7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJCWluZm8oInJ1bm5pbmcgYXQgSElHSCBzcGVlZC4iKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9TUEVFRF9VTktOT1dOOiAvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWVycigiY2Fubm90IGhhbmRsZSBVU0Igc3BlZWQgYmVjYXVzZSBpdCBpcyB1bmtvd24uIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdXNiX3NldF9pbnRmZGF0YShmY191c2ItPnVpbnRmLCBmY191c2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmbGV4Y29wX3VzYl9leGl0KHN0cnVjdCBmbGV4Y29wX3VzYiAqZmNfdXNiKQoreworCXVzYl9zZXRfaW50ZmRhdGEoZmNfdXNiLT51aW50ZiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGZsZXhjb3BfdXNiICpmY191c2IgPSBOVUxMOworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAoKGZjID0gZmxleGNvcF9kZXZpY2Vfa21hbGxvYyhzaXplb2Yoc3RydWN0IGZsZXhjb3BfdXNiKSkpID09IE5VTEwpIHsKKwkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisvKiBnZW5lcmFsIGZsZXhjb3AgaW5pdCAqLworCWZjX3VzYiA9IGZjLT5idXNfc3BlY2lmaWM7CisJZmNfdXNiLT5mY19kZXYgPSBmYzsKKworCWZjLT5yZWFkX2liaV9yZWcgID0gZmxleGNvcF91c2JfcmVhZF9pYmlfcmVnOworCWZjLT53cml0ZV9pYmlfcmVnID0gZmxleGNvcF91c2Jfd3JpdGVfaWJpX3JlZzsKKwlmYy0+aTJjX3JlcXVlc3QgPSBmbGV4Y29wX3VzYl9pMmNfcmVxdWVzdDsKKwlmYy0+Z2V0X21hY19hZGRyID0gZmxleGNvcF91c2JfZ2V0X21hY19hZGRyOworCisJZmMtPnN0cmVhbV9jb250cm9sID0gZmxleGNvcF91c2Jfc3RyZWFtX2NvbnRyb2w7CisKKwlmYy0+cGlkX2ZpbHRlcmluZyA9IDE7CisJZmMtPmJ1c190eXBlID0gRkNfVVNCOworCisJZmMtPmRldiA9ICZ1ZGV2LT5kZXY7CisJZmMtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKy8qIGJ1cyBzcGVjaWZpYyBwYXJ0ICovCisJZmNfdXNiLT51ZGV2ID0gdWRldjsKKwlmY191c2ItPnVpbnRmID0gaW50ZjsKKwlpZiAoKHJldCA9IGZsZXhjb3BfdXNiX2luaXQoZmNfdXNiKSkgIT0gMCkKKwkJZ290byBlcnJfa2ZyZWU7CisKKy8qIGluaXQgZmxleGNvcCAqLworCWlmICgocmV0ID0gZmxleGNvcF9kZXZpY2VfaW5pdGlhbGl6ZShmYykpICE9IDApCisJCWdvdG8gZXJyX3VzYl9leGl0OworCisvKiB4ZmVyIGluaXQgKi8KKwlpZiAoKHJldCA9IGZsZXhjb3BfdXNiX3RyYW5zZmVyX2luaXQoZmNfdXNiKSkgIT0gMCkKKwkJZ290byBlcnJfZmNfZXhpdDsKKworCWluZm8oIiVzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgY29ubmVjdGVkLiIsRFJJVkVSX05BTUUpOworCXJldCA9IDA7CisJZ290byBzdWNjZXNzOworZXJyX2ZjX2V4aXQ6CisJZmxleGNvcF9kZXZpY2VfZXhpdChmYyk7CitlcnJfdXNiX2V4aXQ6CisJZmxleGNvcF91c2JfZXhpdChmY191c2IpOworZXJyX2tmcmVlOgorCWZsZXhjb3BfZGV2aWNlX2tmcmVlKGZjKTsKK3N1Y2Nlc3M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmxleGNvcF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZmxleGNvcF91c2IgKmZjX3VzYiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJZmxleGNvcF91c2JfdHJhbnNmZXJfZXhpdChmY191c2IpOworCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmNfdXNiLT5mY19kZXYpOworCWZsZXhjb3BfdXNiX2V4aXQoZmNfdXNiKTsKKwlmbGV4Y29wX2RldmljZV9rZnJlZShmY191c2ItPmZjX2Rldik7CisJaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGRlaW5pdGlhbGl6ZWQgYW5kIGRpc2Nvbm5lY3RlZC4iLERSSVZFUl9OQU1FKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGZsZXhjb3BfdXNiX3RhYmxlIFtdID0geworCSAgICB7IFVTQl9ERVZJQ0UoMHgwYWY3LCAweDAxMDEpIH0sCisJICAgIHsgfQorfTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGZsZXhjb3BfdXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIlRlY2huaXNhdC9CMkMyIEZsZXhDb3AgSUkvSUliL0lJSSBVU0IiLAorCS5wcm9iZQkJPSBmbGV4Y29wX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGZsZXhjb3BfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZmxleGNvcF91c2JfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZsZXhjb3BfdXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmZmxleGNvcF91c2JfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiAoJWQpIixyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmxleGNvcF91c2JfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZmxleGNvcF91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZmxleGNvcF91c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoZmxleGNvcF91c2JfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBlNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5oCkBAIC0wLDAgKzEsMTE5IEBACisjaWZuZGVmIF9fRkxFWENPUF9VU0JfSF9JTkNMVURFRF9fCisjZGVmaW5lIF9fRkxFWENPUF9VU0JfSF9JTkNMVURFRF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworLyogdHJhbnNmZXIgcGFyYW1ldGVycyAqLworI2RlZmluZSBCMkMyX1VTQl9GUkFNRVNfUEVSX0lTTwkJNAorI2RlZmluZSBCMkMyX1VTQl9OVU1fSVNPX1VSQgkJNAorCisjZGVmaW5lIEIyQzJfVVNCX0NUUkxfUElQRV9JTgkJdXNiX3JjdmN0cmxwaXBlKGZjX3VzYi0+dWRldiwwKQorI2RlZmluZSBCMkMyX1VTQl9DVFJMX1BJUEVfT1VUCQl1c2Jfc25kY3RybHBpcGUoZmNfdXNiLT51ZGV2LDApCisjZGVmaW5lIEIyQzJfVVNCX0RBVEFfUElQRQkJCXVzYl9yY3Zpc29jcGlwZShmY191c2ItPnVkZXYsMHg4MSkKKworc3RydWN0IGZsZXhjb3BfdXNiIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGY7CisKKwl1OCAqaXNvX2J1ZmZlcjsKKwlpbnQgYnVmZmVyX3NpemU7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgdXJiICppc29fdXJiW0IyQzJfVVNCX05VTV9JU09fVVJCXTsKKworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmNfZGV2OworCisJdTggdG1wX2J1ZmZlclsxMDIzKzE5MF07CisJaW50IHRtcF9idWZmZXJfbGVuZ3RoOworfTsKKworI2lmIDAKKy8qIHJlcXVlc3QgdHlwZXMgVE9ETyBXaGF0IGlzIGl0cyB1c2U/Ki8KK3R5cGVkZWYgZW51bSB7CisKKy8qIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoaXMgcGFydAorCVJUWVBFX1JFQURfRFcgICAgICAgICA9ICgxIDw8IDYpLAorCVJUWVBFX1dSSVRFX0RXXzEgICAgICA9ICgzIDw8IDYpLAorCVJUWVBFX1JFQURfVjhfTUVNT1JZICA9ICg2IDw8IDYpLAorCVJUWVBFX1dSSVRFX1Y4X01FTU9SWSA9ICg3IDw8IDYpLAorCVJUWVBFX1dSSVRFX1Y4X0ZMQVNIICA9ICg4IDw8IDYpLAorCVJUWVBFX0dFTkVSSUMgICAgICAgICA9ICg5IDw8IDYpLAorKi8KK30gZmxleGNvcF91c2JfcmVxdWVzdF90eXBlX3Q7CisjZW5kaWYKKworLyogcmVxdWVzdCAqLwordHlwZWRlZiBlbnVtIHsKKwlCMkMyX1VTQl9XUklURV9WOF9NRU0gPSAweDA0LAorCUIyQzJfVVNCX1JFQURfVjhfTUVNICA9IDB4MDUsCisJQjJDMl9VU0JfUkVBRF9SRUcgICAgID0gMHgwOCwKKwlCMkMyX1VTQl9XUklURV9SRUcgICAgPSAweDBBLAorLyoJQjJDMl9VU0JfV1JJVEVSRUdMTyAgID0gMHgwQSwgKi8KKwlCMkMyX1VTQl9XUklURVJFR0hJICAgPSAweDBCLAorCUIyQzJfVVNCX0ZMQVNIX0JMT0NLICA9IDB4MTAsCisJQjJDMl9VU0JfSTJDX1JFUVVFU1QgID0gMHgxMSwKKwlCMkMyX1VTQl9VVElMSVRZICAgICAgPSAweDEyLAorfSBmbGV4Y29wX3VzYl9yZXF1ZXN0X3Q7CisKKy8qIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIEkyQ19SRVFVRVNUICovCit0eXBlZGVmIGVudW0geworCVVTQl9GVU5DX0kyQ19XUklURSAgICAgICA9IDB4MDEsCisJVVNCX0ZVTkNfSTJDX01VTFRJV1JJVEUgID0gMHgwMiwKKwlVU0JfRlVOQ19JMkNfUkVBRCAgICAgICAgPSAweDAzLAorCVVTQl9GVU5DX0kyQ19SRVBFQVRXUklURSA9IDB4MDQsCisJVVNCX0ZVTkNfR0VUX0RFU0NSSVBUT1IgID0gMHgwNSwKKwlVU0JfRlVOQ19JMkNfUkVQRUFUUkVBRCAgPSAweDA2LAorLyogREtUIDAyMDIwOCAtIGFkZCB0aGlzIHRvIHN1cHBvcnQgc3BlY2lhbCBjYXNlIG9mIERpU0VxQyAqLworCVVTQl9GVU5DX0kyQ19DSEVDS1dSSVRFICA9IDB4MDcsCisJVVNCX0ZVTkNfSTJDX0NIRUNLUkVTVUxUID0gMHgwOCwKK30gZmxleGNvcF91c2JfaTJjX2Z1bmN0aW9uX3Q7CisKKy8qCisgKiBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBVVElMSVRZIHJlcXVlc3QgMHgxMgorICogREtUIDAyMDMwNCAtIG5ldyB1dGlsaXR5IGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisJVVRJTElUWV9TRVRfRklMVEVSICAgICAgICAgID0gMHgwMSwKKwlVVElMSVRZX0RBVEFfRU5BQkxFICAgICAgICAgPSAweDAyLAorCVVUSUxJVFlfRkxFWF9NVUxUSVdSSVRFICAgICA9IDB4MDMsCisJVVRJTElUWV9TRVRfQlVGRkVSX1NJWkUgICAgID0gMHgwNCwKKwlVVElMSVRZX0ZMRVhfT1BFUkFUT1IgICAgICAgPSAweDA1LAorCVVUSUxJVFlfRkxFWF9SRVNFVDMwMF9TVEFSVCA9IDB4MDYsCisJVVRJTElUWV9GTEVYX1JFU0VUMzAwX1NUT1AgID0gMHgwNywKKwlVVElMSVRZX0ZMRVhfUkVTRVQzMDAgICAgICAgPSAweDA4LAorCVVUSUxJVFlfU0VUX0lTT19TSVpFICAgICAgICA9IDB4MDksCisJVVRJTElUWV9EQVRBX1JFU0VUICAgICAgICAgID0gMHgwQSwKKwlVVElMSVRZX0dFVF9EQVRBX1NUQVRVUyAgICAgPSAweDEwLAorCVVUSUxJVFlfR0VUX1Y4X1JFRyAgICAgICAgICA9IDB4MTEsCisvKiBES1QgMDIwMzI2IC0gYWRkIGZ1bmN0aW9uIGZvciB2MS4xNCAqLworCVVUSUxJVFlfU1JBTV9XUklURSAgICAgICAgICA9IDB4MTIsCisJVVRJTElUWV9TUkFNX1JFQUQgICAgICAgICAgID0gMHgxMywKKwlVVElMSVRZX1NSQU1fVEVTVEZJTEwgICAgICAgPSAweDE0LAorCVVUSUxJVFlfU1JBTV9URVNUU0VUICAgICAgICA9IDB4MTUsCisJVVRJTElUWV9TUkFNX1RFU1RWRVJJRlkgICAgID0gMHgxNiwKK30gZmxleGNvcF91c2JfdXRpbGl0eV9mdW5jdGlvbl90OworCisjZGVmaW5lIEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1JXICAxKkhaICAgICAgIC8qIDEgcyAqLworI2RlZmluZSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9SRFcgMypIWiAgICAgICAvKiAzIHMgKi8KKyNkZWZpbmUgQjJDMl9XQUlUX0ZPUl9PUEVSQVRJT05fV0RXIDEqSFogICAgICAgLyogMSBzICovCisKKyNkZWZpbmUgQjJDMl9XQUlUX0ZPUl9PUEVSQVRJT05fVjhSRUFEICAgMypIWiAgLyogMyBzICovCisjZGVmaW5lIEIyQzJfV0FJVF9GT1JfT1BFUkFUSU9OX1Y4V1JJVEUgIDMqSFogIC8qIDMgcyAqLworI2RlZmluZSBCMkMyX1dBSVRfRk9SX09QRVJBVElPTl9WOEZMQVNIICAzKkhaICAvKiAzIHMgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlWOF9NRU1PUllfUEFHRV9EVkJfQ0kgPSAweDIwLAorCVY4X01FTU9SWV9QQUdFX0RWQl9EUyA9IDB4NDAsCisJVjhfTUVNT1JZX1BBR0VfTVVMVEkyID0gMHg2MCwKKwlWOF9NRU1PUllfUEFHRV9GTEFTSCAgPSAweDgwCit9IGZsZXhjb3BfdXNiX21lbV9wYWdlX3Q7CisKKyNkZWZpbmUgVjhfTUVNT1JZX0VYVEVOREVEICAgICAgKDEgPDwgMTUpCisKKyNkZWZpbmUgVVNCX01FTV9SRUFEX01BWCAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBVU0JfTUVNX1dSSVRFX01BWCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVVNCX0ZMQVNIX01BWCAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgVjhfTUVNT1JZX1BBR0VfU0laRSAgICAgMHg4MDAwICAgICAgLy8gMzJLCisjZGVmaW5lIFY4X01FTU9SWV9QQUdFX01BU0sgICAgIDB4N0ZGRgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1ZDE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogZmxleGNvcC5jIC0gZHJpdmVyIGZvciBkaWdpdGFsIFRWIGRldmljZXMgZXF1aXBwZWQgd2l0aCBCMkMyIEZsZXhjb3BJSShiKS9JSUkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgc2t5c3RhcjItZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVmFkaW0gQ2F0YW5hLCBza3lzdGFyQG1vbGRvdmEuY2MKKyAqCisgKiBBY2tub3dsZWRnZW1lbnRzOgorICogICAgIEpvaG4gSnVycml1cyBmcm9tIEJCVEksIEluYy4gZm9yIGV4dGVuc2l2ZSBzdXBwb3J0IHdpdGgKKyAqICAgICAgICAgY29kZSBleGFtcGxlcyBhbmQgZGF0YSBib29rcworICoKKyAqICAgICBCamFybmUgU3RlaW5zYm8sIGJqYXJuZSBhdCBzdGVpbnNiby5jb20gKHNvbWUgaWRlYXMgZm9yIHJld3JpdGluZykKKyAqCisgKiBDb250cmlidXRpb25zIHRvIHRoZSBza3lzdGFyMi1kcml2ZXIgaGF2ZSBiZWVuIGRvbmUgYnkKKyAqICAgICBWaW5jZW56byBEaSBNYXNzYSwgaGF3ay5pdCBhdCB0aXNjYWxpbmV0Lml0IChzZXZlcmFsIERpU0VxQyBmaXhlcykKKyAqICAgICBSb2JlcnRvIFJhZ3VzYSwgci5yYWd1c2EgYXQgbGliZXJvLml0IChwb2xpc2hpbmcsIHJlc3R5bGluZyB0aGUgY29kZSkKKyAqICAgICBOaWtsYXMgUGVpbmVja2UsIHBlaW5lY2tlIGF0IGdkdi51bmktaGFubm92ZXIuZGUgKGhhcmR3YXJlIHBpZC9tYWMgZmlsdGVyaW5nKQorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImZsZXhjb3AuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiQjJDMiBGbGV4Y29wSUkvSUkoYikvSUlJIGRpZ2l0YWwgVFYgcmVjZWl2ZXIgY2hpcCIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUiCisKKyNpZmRlZiBDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9ERUJVRworI2RlZmluZSBERUJTVEFUVVMgIiIKKyNlbHNlCisjZGVmaW5lIERFQlNUQVRVUyAiIChkZWJ1Z2dpbmcgaXMgbm90IGVuYWJsZWQpIgorI2VuZGlmCisKK2ludCBiMmMyX2ZsZXhjb3BfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGIyYzJfZmxleGNvcF9kZWJ1ZywgIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnIGxldmVsICgxPWluZm8sMj10dW5lciw0PWkyYyw4PXRzLDE2PXNyYW0gKHwtYWJsZSkpLiIgREVCU1RBVFVTKTsKKyN1bmRlZiBERUJTVEFUVVMKKworLyogZ2xvYmFsIHplcm8gZm9yIGliaSB2YWx1ZXMgKi8KK2ZsZXhjb3BfaWJpX3ZhbHVlIGliaV96ZXJvOworCitzdGF0aWMgaW50IGZsZXhjb3BfZHZiX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBkdmJkbXhmZWVkLT5kZW11eC0+cHJpdjsKKwlyZXR1cm4gZmxleGNvcF9waWRfZmVlZF9jb250cm9sKGZjLGR2YmRteGZlZWQsMSk7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNvcF9kdmJfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZHZiZG14ZmVlZC0+ZGVtdXgtPnByaXY7CisJcmV0dXJuIGZsZXhjb3BfcGlkX2ZlZWRfY29udHJvbChmYyxkdmJkbXhmZWVkLDApOworfQorCitzdGF0aWMgaW50IGZsZXhjb3BfZHZiX2luaXQoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYykKK3sKKwlpbnQgcmV0OworCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmZjLT5kdmJfYWRhcHRlciwiRmxleENvcCBEaWdpdGFsIFRWIGRldmljZSIsZmMtPm93bmVyKSkgPCAwKSB7CisJCWVycigiZXJyb3IgcmVnaXN0ZXJpbmcgRFZCIGFkYXB0ZXIiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZmMtPmR2Yl9hZGFwdGVyLnByaXYgPSBmYzsKKworCWZjLT5kZW11eC5kbXguY2FwYWJpbGl0aWVzID0gKERNWF9UU19GSUxURVJJTkcgfCBETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJZmMtPmRlbXV4LnByaXYgPSBmYzsKKworCWZjLT5kZW11eC5maWx0ZXJudW0gPSBmYy0+ZGVtdXguZmVlZG51bSA9IEZDX01BWF9GRUVEOworCisJZmMtPmRlbXV4LnN0YXJ0X2ZlZWQgPSBmbGV4Y29wX2R2Yl9zdGFydF9mZWVkOworCWZjLT5kZW11eC5zdG9wX2ZlZWQgPSBmbGV4Y29wX2R2Yl9zdG9wX2ZlZWQ7CisJZmMtPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOworCisJaWYgKChyZXQgPSBkdmJfZG14X2luaXQoJmZjLT5kZW11eCkpIDwgMCkgeworCQllcnIoImR2Yl9kbXggZmFpbGVkOiBlcnJvciAlZCIscmV0KTsKKwkJZ290byBlcnJfZG14OworCX0KKworCWZjLT5od19mcm9udGVuZC5zb3VyY2UgPSBETVhfRlJPTlRFTkRfMDsKKworCWZjLT5kbXhkZXYuZmlsdGVybnVtID0gZmMtPmRlbXV4LmZlZWRudW07CisJZmMtPmRteGRldi5kZW11eCA9ICZmYy0+ZGVtdXguZG14OworCWZjLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKKwlpZiAoKHJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmZmMtPmRteGRldiwgJmZjLT5kdmJfYWRhcHRlcikpIDwgMCkgeworCQllcnIoImR2Yl9kbXhkZXZfaW5pdCBmYWlsZWQ6IGVycm9yICVkIixyZXQpOworCQlnb3RvIGVycl9kbXhfZGV2OworCX0KKworCWlmICgocmV0ID0gZmMtPmRlbXV4LmRteC5hZGRfZnJvbnRlbmQoJmZjLT5kZW11eC5kbXgsICZmYy0+aHdfZnJvbnRlbmQpKSA8IDApIHsKKwkJZXJyKCJhZGRpbmcgaHdfZnJvbnRlbmQgdG8gZG14IGZhaWxlZDogZXJyb3IgJWQiLHJldCk7CisJCWdvdG8gZXJyX2RteF9hZGRfaHdfZnJvbnRlbmQ7CisJfQorCisJZmMtPm1lbV9mcm9udGVuZC5zb3VyY2UgPSBETVhfTUVNT1JZX0ZFOworCWlmICgocmV0ID0gZmMtPmRlbXV4LmRteC5hZGRfZnJvbnRlbmQoJmZjLT5kZW11eC5kbXgsICZmYy0+bWVtX2Zyb250ZW5kKSkgPCAwKSB7CisJCWVycigiYWRkaW5nIG1lbV9mcm9udGVuZCB0byBkbXggZmFpbGVkOiBlcnJvciAlZCIscmV0KTsKKwkJZ290byBlcnJfZG14X2FkZF9tZW1fZnJvbnRlbmQ7CisJfQorCisJaWYgKChyZXQgPSBmYy0+ZGVtdXguZG14LmNvbm5lY3RfZnJvbnRlbmQoJmZjLT5kZW11eC5kbXgsICZmYy0+aHdfZnJvbnRlbmQpKSA8IDApIHsKKwkJZXJyKCJjb25uZWN0IGZyb250ZW5kIGZhaWxlZDogZXJyb3IgJWQiLHJldCk7CisJCWdvdG8gZXJyX2Nvbm5lY3RfZnJvbnRlbmQ7CisJfQorCisJZHZiX25ldF9pbml0KCZmYy0+ZHZiX2FkYXB0ZXIsICZmYy0+ZHZibmV0LCAmZmMtPmRlbXV4LmRteCk7CisKKwlmYy0+aW5pdF9zdGF0ZSB8PSBGQ19TVEFURV9EVkJfSU5JVDsKKwlnb3RvIHN1Y2Nlc3M7CisKK2Vycl9jb25uZWN0X2Zyb250ZW5kOgorCWZjLT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZmYy0+ZGVtdXguZG14LCZmYy0+bWVtX2Zyb250ZW5kKTsKK2Vycl9kbXhfYWRkX21lbV9mcm9udGVuZDoKKwlmYy0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZmMtPmRlbXV4LmRteCwmZmMtPmh3X2Zyb250ZW5kKTsKK2Vycl9kbXhfYWRkX2h3X2Zyb250ZW5kOgorCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZmMtPmRteGRldik7CitlcnJfZG14X2RldjoKKwlkdmJfZG14X3JlbGVhc2UoJmZjLT5kZW11eCk7CitlcnJfZG14OgorCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmZjLT5kdmJfYWRhcHRlcik7CisJcmV0dXJuIHJldDsKKworc3VjY2VzczoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmxleGNvcF9kdmJfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKQoreworCWlmIChmYy0+aW5pdF9zdGF0ZSAmIEZDX1NUQVRFX0RWQl9JTklUKSB7CisJCWR2Yl9uZXRfcmVsZWFzZSgmZmMtPmR2Ym5ldCk7CisKKwkJZmMtPmRlbXV4LmRteC5jbG9zZSgmZmMtPmRlbXV4LmRteCk7CisJCWZjLT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZmYy0+ZGVtdXguZG14LCZmYy0+bWVtX2Zyb250ZW5kKTsKKwkJZmMtPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmZjLT5kZW11eC5kbXgsJmZjLT5od19mcm9udGVuZCk7CisJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZmMtPmRteGRldik7CisJCWR2Yl9kbXhfcmVsZWFzZSgmZmMtPmRlbXV4KTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZmMtPmR2Yl9hZGFwdGVyKTsKKworCQlkZWJfaW5mbygiZGVpbml0aWFsaXplZCBkdmIgc3R1ZmZcbiIpOworCX0KKwlmYy0+aW5pdF9zdGF0ZSAmPSB+RkNfU1RBVEVfRFZCX0lOSVQ7Cit9CisKKy8qIHRoZXNlIG1ldGhvZHMgYXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoZSBsb25nLXRlcm0tZ29hbCBvZiBoaWRpbmcgdGhlCisgKiBzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgZnJvbSB0aGUgYnVzLXBhcnRzICovCit2b2lkIGZsZXhjb3BfcGFzc19kbXhfZGF0YShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCWR2Yl9kbXhfc3dmaWx0ZXIoJmZjLT5kZW11eCwgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX3Bhc3NfZG14X2RhdGEpOworCit2b2lkIGZsZXhjb3BfcGFzc19kbXhfcGFja2V0cyhzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCB1OCAqYnVmLCB1MzIgbm8pCit7CisJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKCZmYy0+ZGVtdXgsIGJ1Ziwgbm8pOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX3Bhc3NfZG14X3BhY2tldHMpOworCitzdGF0aWMgdm9pZCBmbGV4Y29wX3Jlc2V0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9pYmlfdmFsdWUgdjIxMCx2MjA0OworCisvKiByZXNldCB0aGUgZmxleGNvcCBpdHNlbGYgKi8KKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCxpYmlfemVybyk7CisKKwl2MjEwLnJhdyA9IDA7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tzID0gMHhmZjsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5CbG9ja19yZXNldF9lbmFibGUgPSAweGIyOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHN3X3Jlc2V0XzIxMCx2MjEwKTsKKworLyogcmVzZXQgdGhlIHBlcmlwaGljYWwgZGV2aWNlcyAqLworCisJdjIwNCA9IGZjLT5yZWFkX2liaV9yZWcoZmMsbWlzY18yMDQpOworCXYyMDQubWlzY18yMDQuUGVyX3Jlc2V0X3NpZyA9IDA7CisJZmMtPndyaXRlX2liaV9yZWcoZmMsbWlzY18yMDQsdjIwNCk7CisJdjIwNC5taXNjXzIwNC5QZXJfcmVzZXRfc2lnID0gMTsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxtaXNjXzIwNCx2MjA0KTsKK30KKworc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmbGV4Y29wX2RldmljZV9rbWFsbG9jKHNpemVfdCBidXNfc3BlY2lmaWNfbGVuKQoreworCXZvaWQgKmJ1czsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZsZXhjb3BfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmYykgeworCQllcnIoIm5vIG1lbW9yeSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGZjLCAwLCBzaXplb2Yoc3RydWN0IGZsZXhjb3BfZGV2aWNlKSk7CisKKwlidXMgPSBrbWFsbG9jKGJ1c19zcGVjaWZpY19sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVzKSB7CisJCWVycigibm8gbWVtb3J5Iik7CisJCWtmcmVlKGZjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChidXMsIDAsIGJ1c19zcGVjaWZpY19sZW4pOworCisJZmMtPmJ1c19zcGVjaWZpYyA9IGJ1czsKKworCXJldHVybiBmYzsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kZXZpY2Vfa21hbGxvYyk7CisKK3ZvaWQgZmxleGNvcF9kZXZpY2Vfa2ZyZWUoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYykKK3sKKwlrZnJlZShmYy0+YnVzX3NwZWNpZmljKTsKKwlrZnJlZShmYyk7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZGV2aWNlX2tmcmVlKTsKKworaW50IGZsZXhjb3BfZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYykKK3sKKwlpbnQgcmV0OworCWliaV96ZXJvLnJhdyA9IDA7CisKKwlmbGV4Y29wX3Jlc2V0KGZjKTsKKwlmbGV4Y29wX2RldGVybWluZV9yZXZpc2lvbihmYyk7CisJZmxleGNvcF9zcmFtX2luaXQoZmMpOworCWZsZXhjb3BfaHdfZmlsdGVyX2luaXQoZmMpOworCisJZmxleGNvcF9zbWNfY3RybChmYywgMCk7CisKKwlpZiAoKHJldCA9IGZsZXhjb3BfZHZiX2luaXQoZmMpKSkKKwkJZ290byBlcnJvcjsKKworCS8qIGRvIHRoZSBNQUMgYWRkcmVzcyByZWFkaW5nIGFmdGVyIGluaXRpYWxpemluZyB0aGUgZHZiX2FkYXB0ZXIgKi8KKwlpZiAoZmMtPmdldF9tYWNfYWRkcihmYywgMCkgPT0gMCkgeworCQl1OCAqYiA9IGZjLT5kdmJfYWRhcHRlci5wcm9wb3NlZF9tYWM7CisJCWluZm8oIk1BQyBhZGRyZXNzID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBiWzBdLGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSk7CisJCWZsZXhjb3Bfc2V0X21hY19maWx0ZXIoZmMsYik7CisJCWZsZXhjb3BfbWFjX2ZpbHRlcl9jdHJsKGZjLDEpOworCX0gZWxzZQorCQl3YXJuKCJyZWFkaW5nIG9mIE1BQyBhZGRyZXNzIGZhaWxlZC5cbiIpOworCisKKwlpZiAoKHJldCA9IGZsZXhjb3BfaTJjX2luaXQoZmMpKSkKKwkJZ290byBlcnJvcjsKKworCWlmICgocmV0ID0gZmxleGNvcF9mcm9udGVuZF9pbml0KGZjKSkpCisJCWdvdG8gZXJyb3I7CisKKwlmbGV4Y29wX2RldmljZV9uYW1lKGZjLCJpbml0aWFsaXphdGlvbiBvZiIsImNvbXBsZXRlIik7CisKKwlyZXQgPSAwOworCWdvdG8gc3VjY2VzczsKK2Vycm9yOgorCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOworc3VjY2VzczoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RldmljZV9pbml0aWFsaXplKTsKKwordm9pZCBmbGV4Y29wX2RldmljZV9leGl0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCit7CisJZmxleGNvcF9mcm9udGVuZF9leGl0KGZjKTsKKwlmbGV4Y29wX2kyY19leGl0KGZjKTsKKwlmbGV4Y29wX2R2Yl9leGl0KGZjKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kZXZpY2VfZXhpdCk7CisKK3N0YXRpYyBpbnQgZmxleGNvcF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWluZm8oRFJJVkVSX05BTUUgIiBsb2FkZWQgc3VjY2Vzc2Z1bGx5Iik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZsZXhjb3BfbW9kdWxlX2NsZWFudXAodm9pZCkKK3sKKwlpbmZvKERSSVZFUl9OQU1FICIgdW5sb2FkZWQgc3VjY2Vzc2Z1bGx5Iik7Cit9CisKK21vZHVsZV9pbml0KGZsZXhjb3BfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoZmxleGNvcF9tb2R1bGVfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWEzNDNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpbnV4IGRyaXZlciB0aGUgZGlnaXRhbCBUViBkZXZpY2VzIGVxdWlwcGVkIHdpdGggQjJDMiBGbGV4Y29wSUkoYikvSUlJCisgKgorICogZmxleGNvcC5oIC0gcHJpdmF0ZSBoZWFkZXIgZmlsZSBmb3IgYWxsIGZsZXhjb3AtY2hpcC1zb3VyY2UgZmlsZXMuCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisjaWZuZGVmIF9fRkxFWENPUF9IX18KKyNkZWZpbmUgX19GTEVYQ09QX0hfX18KKworI2RlZmluZSBGQ19MT0dfUFJFRklYICJiMmMyLWZsZXhjb3AiCisjaW5jbHVkZSAiZmxleGNvcC1jb21tb24uaCIKKworZXh0ZXJuIGludCBiMmMyX2ZsZXhjb3BfZGVidWc7CisKKy8qIGRlYnVnICovCisjaWZkZWYgQ09ORklHX0RWQl9CMkMyX0ZMRVhDT1BfREVCVUcKKyNkZWZpbmUgZHByaW50ayhsZXZlbCxhcmdzLi4uKSBcCisJZG8geyBpZiAoKGIyYzJfZmxleGNvcF9kZWJ1ZyAmIGxldmVsKSkgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhsZXZlbCxhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgIGRwcmludGsoMHgwMSxhcmdzKQorI2RlZmluZSBkZWJfdHVuZXIoYXJncy4uLikgZHByaW50aygweDAyLGFyZ3MpCisjZGVmaW5lIGRlYl9pMmMoYXJncy4uLikgICBkcHJpbnRrKDB4MDQsYXJncykKKyNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgIGRwcmludGsoMHgwOCxhcmdzKQorI2RlZmluZSBkZWJfc3JhbShhcmdzLi4uKSAgZHByaW50aygweDEwLGFyZ3MpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jCmluZGV4IDMzNmMxNzguLmFjYmM0YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvc2t5c3RhcjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL3NreXN0YXIyLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAl1OCBtYWNfYWRkcls4XTsKIAl1MzIgZHdfc3JhbV90eXBlOwogCi0Jc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXB0ZXI7CiAJc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKIAlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOwpAQCAtMjQ2MSw3ICsyNDYxLDcgQEAKIAkJICAgICAgIHNreXN0YXIyLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAogCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCX0gZWxzZSB7Ci0JCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoc2t5c3RhcjItPmR2Yl9hZGFwdGVyLCBza3lzdGFyMi0+ZmUpKSB7CisJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnNreXN0YXIyLT5kdmJfYWRhcHRlciwgc2t5c3RhcjItPmZlKSkgewogCQkJcHJpbnRrKCJza3lzdGFyMjogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwogCQkJaWYgKHNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKQogCQkJCXNreXN0YXIyLT5mZS0+b3BzLT5yZWxlYXNlKHNreXN0YXIyLT5mZSk7CkBAIC0yNDg2LDE3ICsyNDg2LDE3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmR2Yl9hZGFwdGVyLCBza3lzdGFyMl9wY2lfZHJpdmVyLm5hbWUsCisJYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlkdmJfYWRhcHRlciA9ICZhZGFwdGVyLT5kdmJfYWRhcHRlcjsKKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyLCBza3lzdGFyMl9wY2lfZHJpdmVyLm5hbWUsCiAJCQkJICAgVEhJU19NT0RVTEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygiJXM6IEVycm9yIHJlZ2lzdGVyaW5nIERWQiBhZGFwdGVyXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycl9oYWx0OwogCX0KIAotCWFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KIAlkdmJfYWRhcHRlci0+cHJpdiA9IGFkYXB0ZXI7Ci0JYWRhcHRlci0+ZHZiX2FkYXB0ZXIgPSBkdmJfYWRhcHRlcjsKIAogCiAJaW5pdF9NVVRFWCgmYWRhcHRlci0+aTJjX3NlbSk7CkBAIC0yNTQxLDcgKzI1NDEsNyBAQAogCWFkYXB0ZXItPmRteGRldi5kZW11eCA9IGRteDsKIAlhZGFwdGVyLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKIAotCXJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmYWRhcHRlci0+ZG14ZGV2LCBhZGFwdGVyLT5kdmJfYWRhcHRlcik7CisJcmV0ID0gZHZiX2RteGRldl9pbml0KCZhZGFwdGVyLT5kbXhkZXYsICZhZGFwdGVyLT5kdmJfYWRhcHRlcik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2RteF9yZWxlYXNlOwogCkBAIC0yNTU5LDcgKzI1NTksNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9yZW1vdmVfbWVtX2Zyb250ZW5kOwogCi0JZHZiX25ldF9pbml0KGFkYXB0ZXItPmR2Yl9hZGFwdGVyLCAmYWRhcHRlci0+ZHZibmV0LCAmZHZiZGVtdXgtPmRteCk7CisJZHZiX25ldF9pbml0KCZhZGFwdGVyLT5kdmJfYWRhcHRlciwgJmFkYXB0ZXItPmR2Ym5ldCwgJmR2YmRlbXV4LT5kbXgpOwogCiAJZnJvbnRlbmRfaW5pdChhZGFwdGVyKTsKIG91dDoKQEAgLTI1NzYsNyArMjU3Niw3IEBACiBlcnJfaTJjX2RlbDoKIAlpMmNfZGVsX2FkYXB0ZXIoJmFkYXB0ZXItPmkyY19hZGFwKTsKIGVycl9kdmJfdW5yZWdpc3RlcjoKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZhZGFwdGVyLT5kdmJfYWRhcHRlcik7CiBlcnJfaGFsdDoKIAlkcml2ZXJfaGFsdChwZGV2KTsKIAlnb3RvIG91dDsKQEAgLTI2MDUsNyArMjYwNSw3IEBACiAJaWYgKGFkYXB0ZXItPmZlICE9IE5VTEwpCiAJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXB0ZXItPmZlKTsKIAotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoYWRhcHRlci0+ZHZiX2FkYXB0ZXIpOworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKIAogCQkJaTJjX2RlbF9hZGFwdGVyKCZhZGFwdGVyLT5pMmNfYWRhcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnCmluZGV4IGU3ZDExZTAuLmIxMjU0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZwpAQCAtMTEsOSArMTEsOCBAQAogCSAgdGhlIE5lYnVsYSBjYXJkcywgdGhlIFBpbm5hY2xlIFBDVFYgY2FyZHMsIHRoZSBUd2luaGFuIERTVCBjYXJkcyBhbmQKIAkgIHBjSERUViBIRDIwMDAgY2FyZHMuCiAKLSAgICAgICAgICBTaW5jZSB0aGVzZSBjYXJkcyBoYXZlIG5vIE1QRUcgZGVjb2RlciBvbmJvYXJkLCB0aGV5IHRyYW5zbWl0CisJICBTaW5jZSB0aGVzZSBjYXJkcyBoYXZlIG5vIE1QRUcgZGVjb2RlciBvbmJvYXJkLCB0aGV5IHRyYW5zbWl0CiAJICBvbmx5IGNvbXByZXNzZWQgTVBFRyBkYXRhIG92ZXIgdGhlIFBDSSBidXMsIHNvIHlvdSBuZWVkCiAJICBhbiBleHRlcm5hbCBzb2Z0d2FyZSBkZWNvZGVyIHRvIHdhdGNoIFRWIG9uIHlvdXIgY29tcHV0ZXIuCiAKIAkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvTWFrZWZpbGUKaW5kZXggOWRhODYwNC4uZDE4OGU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvTWFrZWZpbGUKQEAgLTEsNSArMSwzIEBACi0KLW9iai0kKENPTkZJR19EVkJfQlQ4WFgpICs9IGJ0ODc4Lm8gZHZiLWJ0OHh4Lm8gZHN0Lm8KK29iai0kKENPTkZJR19EVkJfQlQ4WFgpICs9IGJ0ODc4Lm8gZHZiLWJ0OHh4Lm8gZHN0Lm8gZHN0X2NhLm8KIAogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL3ZpZGVvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCmluZGV4IDIxM2ZmNzkuLjNjNWE4ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwpAQCAtNCwyNyArNCwyNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEB0LW9ubGluZS5kZT4KICAqCiAgKiBsYXJnZSBwYXJ0cyBiYXNlZCBvbiB0aGUgYnR0diBkcml2ZXIKLSAqIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQotICogICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AbWV0emxlcmJyb3MuZGUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgKG1vY21AbWV0emxlcmJyb3MuZGUpCiAgKiAoYykgMTk5OSwyMDAwIEdlcmQgS25vcnIgPGtyYXhlbEBnb2xkYmFjaC5pbi1iZXJsaW4uZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKIAogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAorICoKIAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKLSAqIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01OCw3ICs1OCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsCiAJCSAidmVyYm9zZSBzdGFydHVwIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYnQ4NzhfZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nLCBkZWZhdWx0IGlzIDAgKG9mZikuIik7CiAKIGludCBidDg3OF9udW07CiBzdHJ1Y3QgYnQ4NzggYnQ4NzhbQlQ4NzhfTUFYXTsKQEAgLTEyOCwyMSArMTI4LDIxIEBACiB9CiAKIC8qIFJJU0MgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFJJU0NfV1JJVEUgICAgICAgIAkoMHgwMSA8PCAyOCkKLSNkZWZpbmUgUklTQ19KVU1QICAgICAgICAgCSgweDA3IDw8IDI4KQotI2RlZmluZSBSSVNDX1NZTkMgICAgICAgICAJKDB4MDggPDwgMjgpCisjZGVmaW5lIFJJU0NfV1JJVEUJCSgweDAxIDw8IDI4KQorI2RlZmluZSBSSVNDX0pVTVAJCSgweDA3IDw8IDI4KQorI2RlZmluZSBSSVNDX1NZTkMJCSgweDA4IDw8IDI4KQogCiAvKiBSSVNDIGJpdHMgKi8KLSNkZWZpbmUgUklTQ19XUl9TT0wgICAgICAgCSgxIDw8IDI3KQotI2RlZmluZSBSSVNDX1dSX0VPTCAgICAgICAJKDEgPDwgMjYpCi0jZGVmaW5lIFJJU0NfSVJRICAgICAgICAgIAkoMSA8PCAyNCkKKyNkZWZpbmUgUklTQ19XUl9TT0wJCSgxIDw8IDI3KQorI2RlZmluZSBSSVNDX1dSX0VPTAkJKDEgPDwgMjYpCisjZGVmaW5lIFJJU0NfSVJRCQkoMSA8PCAyNCkKICNkZWZpbmUgUklTQ19TVEFUVVMoc3RhdHVzKQkoKCgofnN0YXR1cykgJiAweDBGKSA8PCAyMCkgfCAoKHN0YXR1cyAmIDB4MEYpIDw8IDE2KSkKLSNkZWZpbmUgUklTQ19TWU5DX1JFU1lOQyAgCSgxIDw8IDE1KQotI2RlZmluZSBSSVNDX1NZTkNfRk0xICAgICAJMHgwNgotI2RlZmluZSBSSVNDX1NZTkNfVlJPICAgICAJMHgwQworI2RlZmluZSBSSVNDX1NZTkNfUkVTWU5DCSgxIDw8IDE1KQorI2RlZmluZSBSSVNDX1NZTkNfRk0xCQkweDA2CisjZGVmaW5lIFJJU0NfU1lOQ19WUk8JCTB4MEMKIAogI2RlZmluZSBSSVNDX0ZMVVNIKCkJCWJ0LT5yaXNjX3BvcyA9IDAKLSNkZWZpbmUgUklTQ19JTlNUUihpbnN0cikgCWJ0LT5yaXNjX2NwdVtidC0+cmlzY19wb3MrK10gPSBjcHVfdG9fbGUzMihpbnN0cikKKyNkZWZpbmUgUklTQ19JTlNUUihpbnN0cikJYnQtPnJpc2NfY3B1W2J0LT5yaXNjX3BvcysrXSA9IGNwdV90b19sZTMyKGluc3RyKQogCiBzdGF0aWMgaW50IGJ0ODc4X21ha2VfcmlzYyhzdHJ1Y3QgYnQ4NzggKmJ0KQogewpAQCAtMTczLDcgKzE3Myw3IEBACiAJUklTQ19JTlNUUihSSVNDX1NZTkMgfCBSSVNDX1NZTkNfRk0xIHwgb3Bfc3luY19vcmluKTsKIAlSSVNDX0lOU1RSKDApOwogCi0JZHByaW50aygiYnQ4Nzg6IHJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldVxuIiwgCisJZHByaW50aygiYnQ4Nzg6IHJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldVxuIiwKIAkJCWJ0LT5saW5lX2NvdW50LCBidC0+bGluZV9ieXRlcyk7CiAJZm9yIChsaW5lID0gMDsgbGluZSA8IGJ0LT5saW5lX2NvdW50OyBsaW5lKyspIHsKIAkJLy8gQXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBibG9jayB3ZSBpc3N1ZSBhbiBJUlEgd2l0aCBwcmV2aW91cyAoZmluaXNoZWQpIGJsb2NrIG51bWJlciBzZXQKQEAgLTIyOCwxNCArMjI4LDE0IEBACiAJICogSGFja2VkIGZvciBEU1QgdG86CiAJICogU0NFUlIgfCBPQ0VSUiB8IEZEU1IgfCBGVFJHVCB8IEZCVVMgfCBSSVNDSQogCSAqLwotCWludF9tYXNrID0gQlQ4NzhfQVNDRVJSIHwgQlQ4NzhfQU9DRVJSIHwgQlQ4NzhfQVBBQk9SVCB8IAotCQlCVDg3OF9BUklQRVJSIHwgQlQ4NzhfQVBQRVJSIHwgQlQ4NzhfQUZEU1IgfCBCVDg3OF9BRlRSR1QgfCAKKwlpbnRfbWFzayA9IEJUODc4X0FTQ0VSUiB8IEJUODc4X0FPQ0VSUiB8IEJUODc4X0FQQUJPUlQgfAorCQlCVDg3OF9BUklQRVJSIHwgQlQ4NzhfQVBQRVJSIHwgQlQ4NzhfQUZEU1IgfCBCVDg3OF9BRlRSR1QgfAogCQlCVDg3OF9BRkJVUyB8IEJUODc4X0FSSVNDSTsKIAogCiAJLyogaWdub3JlIHBlc2t5IGJpdHMgKi8KIAlpbnRfbWFzayAmPSB+aXJxX2Vycl9pZ25vcmU7Ci0JCisKIAlidHdyaXRlKGludF9tYXNrLCBCVDg3OF9BSU5UX01BU0spOwogCWJ0d3JpdGUoY29udHJvbHJlZywgQlQ4NzhfQUdQSU9fRE1BX0NUTCk7CiB9CkBAIC00NjEsOSArNDYxLDkgQEAKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBidCk7CiAKIC8qICAgICAgICBpZihpbml0X2J0ODc4KGJ0dikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYnQ4NzhfcmVtb3ZlKGRldik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KKwkJYnQ4NzhfcmVtb3ZlKGRldik7CisJCXJldHVybiAtRUlPOworCX0KICovCiAKIAlpZiAoKHJlc3VsdCA9IGJ0ODc4X21lbV9hbGxvYyhidCkpKSB7CkBAIC01MzYsMTAgKzUzNiwxMCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJ0ODc4X3BjaV90YmwpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnQ4NzhfcGNpX2RyaXZlciA9IHsKLSAgICAgIC5uYW1lIAk9ICJidDg3OCIsCisgICAgICAubmFtZQk9ICJidDg3OCIsCiAgICAgICAuaWRfdGFibGUgPSBidDg3OF9wY2lfdGJsLAotICAgICAgLnByb2JlIAk9IGJ0ODc4X3Byb2JlLAotICAgICAgLnJlbW92ZSAJPSBidDg3OF9yZW1vdmUsCisgICAgICAucHJvYmUJPSBidDg3OF9wcm9iZSwKKyAgICAgIC5yZW1vdmUJPSBidDg3OF9yZW1vdmUsCiB9OwogCiBzdGF0aWMgaW50IGJ0ODc4X3BjaV9kcml2ZXJfcmVnaXN0ZXJlZCA9IDA7CkBAIC01NTgsNyArNTU4LDcgQEAKIAkgICAgICAgKEJUODc4X1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCiAJICAgICAgIEJUODc4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwogLyoKLSAgICAgICAgYnQ4NzhfY2hlY2tfY2hpcHNldCgpOworCWJ0ODc4X2NoZWNrX2NoaXBzZXQoKTsKICovCiAJLyogbGF0ZXIgd2UgcmVnaXN0ZXIgaW5zaWRlIG9mIGJ0ODc4X2ZpbmRfYXVkaW9fZG1hKCkKIAkgKiBiZWNhdXNlIHdlIG1heSB3YW50IHRvIGlnbm9yZSBjZXJ0YWluIGNhcmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguaAppbmRleCBlMWI5ODA5Li44Mzc2MjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmgKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgICAgYnQ4NzguaCAtIEJ0ODc4IGF1ZGlvIG1vZHVsZSAocmVnaXN0ZXIgb2Zmc2V0cykKIAogICAgIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAdC1vbmxpbmUuZGU+CkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogCXUzMiByaXNjX3BvczsKIAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwotCWludCBzaHV0ZG93bjsJCisJaW50IHNodXRkb3duOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBidDg3OCBidDg3OFtCVDg3OF9NQVhdOwogCiB2b2lkIGJ0ODc4X3N0YXJ0KHN0cnVjdCBidDg3OCAqYnQsIHUzMiBjb250cm9scmVnLCB1MzIgb3Bfc3luY19vcmluLAogCQl1MzIgaXJxX2Vycl9pZ25vcmUpOwotdm9pZCBidDg3OF9zdG9wKHN0cnVjdCBidDg3OCAqYnQpOwkgICAgIAordm9pZCBidDg3OF9zdG9wKHN0cnVjdCBidDg3OCAqYnQpOwogCiAjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykJLyogYmlnLWVuZGlhbiAqLwogZXh0ZXJuIF9faW5saW5lX18gdm9pZCBpb19zdF9sZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKaW5kZXggZWFjODM3Ni4uZDA0N2UzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKQEAgLTEsMjUgKzEsMjUgQEAKIC8qCi0gICAgRnJvbnRlbmQtZHJpdmVyIGZvciBUd2luSGFuIERTVCBGcm9udGVuZAogCi0gICAgQ29weXJpZ2h0IChDKSAyMDAzIEphbWllIEhvbmFuCisJRnJvbnRlbmQvQ2FyZCBkcml2ZXIgZm9yIFR3aW5IYW4gRFNUIEZyb250ZW5kCisJQ29weXJpZ2h0IChDKSAyMDAzIEphbWllIEhvbmFuCisJQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IE1hbnUgQWJyYWhhbSAobWFudUBrcm9tdGVrLmNvbSkKIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIAotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzEsNTkgKzMxLDIyIEBACiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJkc3RfcHJpdi5oIgotI2luY2x1ZGUgImRzdC5oIgorI2luY2x1ZGUgImRzdF9jb21tb24uaCIKIAotc3RydWN0IGRzdF9zdGF0ZSB7CiAKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDE7Cittb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CiAKLQlzdHJ1Y3QgYnQ4NzgqIGJ0Oworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMCAoeWVzKSIpOwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOworc3RhdGljIHVuc2lnbmVkIGludCBkc3RfYWRkb25zOworbW9kdWxlX3BhcmFtKGRzdF9hZGRvbnMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRzdF9hZGRvbnMsICJDQSBkYXVnaHRlcmJvYXJkLCBkZWZhdWx0IGlzIDAgKE5vIGFkZG9ucykiKTsKIAotCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KLQljb25zdCBzdHJ1Y3QgZHN0X2NvbmZpZyogY29uZmlnOwotCi0Jc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKLQotCS8qIHByaXZhdGUgZGVtb2R1bGF0b3IgZGF0YSAqLwotCXU4IHR4X3R1bmFbMTBdOwotCXU4IHJ4X3R1bmFbMTBdOwotCXU4IHJ4YnVmZmVyWzEwXTsKLQl1OCBkaXNlcV9mbGFnczsKLQl1OCBkc3RfdHlwZTsKLQl1MzIgdHlwZV9mbGFnczsKLQl1MzIgZnJlcXVlbmN5OwkJLyogaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBpbiBrSHogZm9yIFFQU0sgKi8KLQlmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247Ci0JdTMyIHN5bWJvbF9yYXRlOwkvKiBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgKi8KLQlmZV9jb2RlX3JhdGVfdCBmZWM7Ci0JZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlOwotCWZlX3NlY190b25lX21vZGVfdCB0b25lOwotCXUzMiBkZWNvZGVfZnJlcTsKLQl1OCBkZWNvZGVfbG9jazsKLQl1MTYgZGVjb2RlX3N0cmVuZ3RoOwotCXUxNiBkZWNvZGVfc25yOwotCXVuc2lnbmVkIGxvbmcgY3VyX2ppZmY7Ci0JdTggazIyOwotCWZlX2JhbmR3aWR0aF90IGJhbmR3aWR0aDsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZHN0X3ZlcmJvc2UgPSAwOwotbW9kdWxlX3BhcmFtKGRzdF92ZXJib3NlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkc3RfdmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRzdF9kZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0oZHN0X2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkc3RfZGVidWcsICJkZWJ1ZyBtZXNzYWdlcywgZGVmYXVsdCBpcyAwIChubykiKTsKLQotI2RlZmluZSBkcHJpbnRrCWlmIChkc3RfZGVidWcpIHByaW50awotCi0jZGVmaW5lIERTVF9UWVBFX0lTX1NBVAkJMAotI2RlZmluZSBEU1RfVFlQRV9JU19URVJSCTEKLSNkZWZpbmUgRFNUX1RZUEVfSVNfQ0FCTEUJMgotCi0jZGVmaW5lIERTVF9UWVBFX0hBU19ORVdUVU5FCTEKLSNkZWZpbmUgRFNUX1RZUEVfSEFTX1RTMjA0CTIKLSNkZWZpbmUgRFNUX1RZUEVfSEFTX1NZTURJVgk0CisjZGVmaW5lIGRwcmludGsJaWYgKGRlYnVnKSBwcmludGsKIAogI2RlZmluZSBIQVNfTE9DSwkxCiAjZGVmaW5lIEFUVEVNUFRfVFVORQkyCkBAIC05Nyw3ICs2MCw3IEBACiAJYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfVFMsICZiaXRzKTsKIH0KIAotc3RhdGljIGludCBkc3RfZ3Bpb19vdXRiKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCB1MzIgbWFzaywgdTMyIGVuYmIsIHUzMiBvdXRoaWdoKQoraW50IGRzdF9ncGlvX291dGIoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHUzMiBtYXNrLCB1MzIgZW5iYiwgdTMyIG91dGhpZ2gsIGludCBkZWxheSkKIHsKIAl1bmlvbiBkc3RfZ3Bpb19wYWNrZXQgZW5iOwogCXVuaW9uIGRzdF9ncGlvX3BhY2tldCBiaXRzOwpAQCAtMTA1LDI2ICs2OCwzMyBAQAogCiAJZW5iLmVuYi5tYXNrID0gbWFzazsKIAllbmIuZW5iLmVuYWJsZSA9IGVuYmI7CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCIlczogbWFzaz1bJTA0eF0sIGVuYmI9WyUwNHhdLCBvdXRoaWdoPVslMDR4XVxuIiwgX19GVU5DVElPTl9fLCBtYXNrLCBlbmJiLCBvdXRoaWdoKTsKKwogCWlmICgoZXJyID0gYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfRU5BQkxFLCAmZW5iKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19lbmIgZXJyb3IgKGVyciA9PSAlaSwgbWFzayA9PSAweCUwMngsIGVuYiA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgbWFzaywgZW5iYik7CisJCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19lbmIgZXJyb3IgKGVyciA9PSAlaSwgbWFzayA9PSAlMDJ4LCBlbmIgPT0gJTAyeClcbiIsIF9fRlVOQ1RJT05fXywgZXJyLCBtYXNrLCBlbmJiKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCisJdWRlbGF5KDEwMDApOwogCS8qIGJlY2F1c2UgY29tcGxldGUgZGlzYWJsaW5nIG1lYW5zIG5vIG91dHB1dCwgbm8gbmVlZCB0byBkbyBvdXRwdXQgcGFja2V0ICovCiAJaWYgKGVuYmIgPT0gMCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoZGVsYXkpCisJCW1zbGVlcCgxMCk7CisKIAliaXRzLm91dHAubWFzayA9IGVuYmI7CiAJYml0cy5vdXRwLmhpZ2h2YWxzID0gb3V0aGlnaDsKIAogCWlmICgoZXJyID0gYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfV1JJVEUsICZiaXRzKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIGVycm9yIChlcnIgPT0gJWksIGVuYmIgPT0gMHglMDJ4LCBvdXRoaWdoID09IDB4JTAyeClcbiIsIF9fRlVOQ1RJT05fXywgZXJyLCBlbmJiLCBvdXRoaWdoKTsKKwkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgZXJyb3IgKGVyciA9PSAlaSwgZW5iYiA9PSAlMDJ4LCBvdXRoaWdoID09ICUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgZW5iYiwgb3V0aGlnaCk7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHN0X2dwaW9fb3V0Yik7CiAKLXN0YXRpYyBpbnQgZHN0X2dwaW9faW5iKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqIHJlc3VsdCkKK2ludCBkc3RfZ3Bpb19pbmIoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmVzdWx0KQogewogCXVuaW9uIGRzdF9ncGlvX3BhY2tldCByZF9wYWNrZXQ7CiAJaW50IGVycjsKQEAgLTEzOSwxNDMgKzEwOSwyMjUgQEAKIAkqcmVzdWx0ID0gKHU4KSByZF9wYWNrZXQucmQudmFsdWU7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRzdF9ncGlvX2luYik7CiAKLSNkZWZpbmUgRFNUX0kyQ19FTkFCTEUJMQotI2RlZmluZSBEU1RfODgyMAkyCi0KLXN0YXRpYyBpbnQgZHN0X3Jlc2V0ODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK2ludCByZGNfcmVzZXRfc3RhdGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JaW50IHJldHZhbDsKLQkvKiBwdWxsIDg4MjAgZ3BpbyBwaW4gbG93LCB3YWl0LCBoaWdoLCB3YWl0LCB0aGVuIGxvdyAqLwotCS8vIGRwcmludGsgKCIlczogcmVzZXQgODgyMFxuIiwgX19GVU5DVElPTl9fKTsKLQlyZXR2YWwgPSBkc3RfZ3Bpb19vdXRiKHN0YXRlLCBEU1RfODgyMCwgRFNUXzg4MjAsIDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOworCWlmICh2ZXJib3NlID4gMSkKKwkJZHByaW50aygiJXM6IFJlc2V0dGluZyBzdGF0ZSBtYWNoaW5lXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKGRzdF9ncGlvX291dGIoc3RhdGUsIFJEQ184ODIwX0lOVCwgUkRDXzg4MjBfSU5ULCAwLCBOT19ERUxBWSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKIAltc2xlZXAoMTApOwotCXJldHZhbCA9IGRzdF9ncGlvX291dGIoc3RhdGUsIERTVF84ODIwLCBEU1RfODgyMCwgRFNUXzg4MjApOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOwotCS8qIHdhaXQgZm9yIG1vcmUgZmVlZGJhY2sgb24gd2hhdCB3b3JrcyBoZXJlICoKLQkgICBtc2xlZXAoMTApOwotCSAgIHJldHZhbCA9IGRzdF9ncGlvX291dGIoZHN0LCBEU1RfODgyMCwgRFNUXzg4MjAsIDApOwotCSAgIGlmIChyZXR2YWwgPCAwKQotCSAgIHJldHVybiByZXR2YWw7Ci0JICovCisKKwlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgUkRDXzg4MjBfSU5ULCBSRENfODgyMF9JTlQsIFJEQ184ODIwX0lOVCwgTk9fREVMQVkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQltc2xlZXAoMTApOworCQlyZXR1cm4gLTE7CisJfQorCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHJkY19yZXNldF9zdGF0ZSk7CiAKLXN0YXRpYyBpbnQgZHN0X2kyY19lbmFibGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCitpbnQgcmRjXzg4MjBfcmVzZXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JaW50IHJldHZhbDsKLQkvKiBwdWxsIEkyQyBlbmFibGUgZ3BpbyBwaW4gbG93LCB3YWl0ICovCi0JLy8gZHByaW50ayAoIiVzOiBpMmMgZW5hYmxlXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHZhbCA9IGRzdF9ncGlvX291dGIoc3RhdGUsIH4wLCBEU1RfSTJDX0VOQUJMRSwgMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0JLy8gZHByaW50ayAoIiVzOiBpMmMgZW5hYmxlIGRlbGF5XG4iLCBfX0ZVTkNUSU9OX18pOwotCW1zbGVlcCgzMyk7CisJaWYgKHZlcmJvc2UgPiAxKQorCQlkcHJpbnRrKCIlczogUmVzZXR0aW5nIERTVFxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCBSRENfODgyMF9SRVNFVCwgUkRDXzg4MjBfUkVTRVQsIDAsIE5PX0RFTEFZKSA8IDApIHsKKwkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1ZGVsYXkoMTAwMCk7CisJaWYgKGRzdF9ncGlvX291dGIoc3RhdGUsIFJEQ184ODIwX1JFU0VULCBSRENfODgyMF9SRVNFVCwgUkRDXzg4MjBfUkVTRVQsIERFTEFZKSA8IDApIHsKKwkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChyZGNfODgyMF9yZXNldCk7CiAKLXN0YXRpYyBpbnQgZHN0X2kyY19kaXNhYmxlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoraW50IGRzdF9waW9fZW5hYmxlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewotCWludCByZXR2YWw7Ci0JLyogcmVsZWFzZSBJMkMgZW5hYmxlIGdwaW8gcGluLCB3YWl0ICovCi0JLy8gZHByaW50ayAoIiVzOiBpMmMgZGlzYWJsZVxuIiwgX19GVU5DVElPTl9fKTsKLQlyZXR2YWwgPSBkc3RfZ3Bpb19vdXRiKHN0YXRlLCB+MCwgMCwgMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0JLy8gZHByaW50ayAoIiVzOiBpMmMgZGlzYWJsZSBkZWxheVxuIiwgX19GVU5DVElPTl9fKTsKLQltc2xlZXAoMzMpOworCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCB+MCwgUkRDXzg4MjBfUElPXzBfRU5BQkxFLCAwLCBOT19ERUxBWSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJdWRlbGF5KDEwMDApOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkc3RfcGlvX2VuYWJsZSk7CiAKLXN0YXRpYyBpbnQgZHN0X3dhaXRfZHN0X3JlYWR5KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoraW50IGRzdF9waW9fZGlzYWJsZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgfjAsIFJEQ184ODIwX1BJT18wX0RJU0FCTEUsIFJEQ184ODIwX1BJT18wX0RJU0FCTEUsIE5PX0RFTEFZKSA8IDApIHsKKwkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMSkKKwkJdWRlbGF5KDEwMDApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRzdF9waW9fZGlzYWJsZSk7CisKK2ludCBkc3Rfd2FpdF9kc3RfcmVhZHkoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4IGRlbGF5X21vZGUpCiB7CiAJdTggcmVwbHk7Ci0JaW50IHJldHZhbDsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQlyZXR2YWwgPSBkc3RfZ3Bpb19pbmIoc3RhdGUsICZyZXBseSk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJaWYgKChyZXBseSAmIERTVF9JMkNfRU5BQkxFKSA9PSAwKSB7Ci0JCQlkcHJpbnRrKCIlczogZHN0IHdhaXQgcmVhZHkgYWZ0ZXIgJWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisJCWlmIChkc3RfZ3Bpb19pbmIoc3RhdGUsICZyZXBseSkgPCAwKSB7CisJCQlkcHJpbnRrKCIlczogZHN0X2dwaW9faW5iIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoKHJlcGx5ICYgUkRDXzg4MjBfUElPXzBfRU5BQkxFKSA9PSAwKSB7CisJCQlpZiAodmVyYm9zZSA+IDQpCisJCQkJZHByaW50aygiJXM6IGRzdCB3YWl0IHJlYWR5IGFmdGVyICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJbXNsZWVwKDEwKTsKIAl9Ci0JZHByaW50aygiJXM6IGRzdCB3YWl0IE5PVCByZWFkeSBhZnRlciAlZFxuIiwgX19GVU5DVElPTl9fLCBpKTsKKwlpZiAodmVyYm9zZSA+IDEpCisJCWRwcmludGsoIiVzOiBkc3Qgd2FpdCBOT1QgcmVhZHkgYWZ0ZXIgJWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHN0X3dhaXRfZHN0X3JlYWR5KTsKIAotc3RhdGljIGludCB3cml0ZV9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogZGF0YSwgdTggbGVuKQoraW50IGRzdF9lcnJvcl9yZWNvdmVyeShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKCIlczogVHJ5aW5nIHRvIHJldHVybiBmcm9tIHByZXZpb3VzIGVycm9ycy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkc3RfcGlvX2Rpc2FibGUoc3RhdGUpOworCW1zbGVlcCgxMCk7CisJZHN0X3Bpb19lbmFibGUoc3RhdGUpOworCW1zbGVlcCgxMCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHN0X2Vycm9yX3JlY292ZXJ5KTsKKworaW50IGRzdF9lcnJvcl9iYWlsb3V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCWRwcmludGsoIiVzOiBUcnlpbmcgdG8gYmFpbG91dCBmcm9tIHByZXZpb3VzIGVycm9yLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCXJkY184ODIwX3Jlc2V0KHN0YXRlKTsKKwlkc3RfcGlvX2Rpc2FibGUoc3RhdGUpOworCW1zbGVlcCgxMCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHN0X2Vycm9yX2JhaWxvdXQpOworCisKK2ludCBkc3RfY29tbV9pbml0KHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlKQoreworCWlmICh2ZXJib3NlID4gMSkKKwkJZHByaW50ayAoIiVzOiBJbml0aWFsaXppbmcgRFNULi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKChkc3RfcGlvX2VuYWJsZShzdGF0ZSkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogUElPIEVuYWJsZSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgocmRjX3Jlc2V0X3N0YXRlKHN0YXRlKSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBSREMgODgyMCBTdGF0ZSBSRVNFVCBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQorCQltc2xlZXAoMTAwKTsKKwllbHNlCisJCW1zbGVlcCg1KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkc3RfY29tbV9pbml0KTsKKworCitpbnQgd3JpdGVfZHN0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqZGF0YSwgdTggbGVuKQogewogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKIAkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IGRhdGEsLmxlbiA9IGxlbgogCX07CisKIAlpbnQgZXJyOwogCWludCBjbnQ7Ci0KLQlpZiAoZHN0X2RlYnVnICYmIGRzdF92ZXJib3NlKSB7CisJaWYgKGRlYnVnICYmICh2ZXJib3NlID4gNCkpIHsKIAkJdTggaTsKLQkJZHByaW50aygiJXMgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJZHByaW50aygiIDB4JTAyeCIsIGRhdGFbaV0pOworCQlpZiAodmVyYm9zZSA+IDQpIHsKKwkJCWRwcmludGsoIiVzIHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCWRwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCQlkcHJpbnRrKCJcbiIpOwogCQl9Ci0JCWRwcmludGsoIlxuIik7CiAJfQotCW1zbGVlcCgzMCk7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCA0OyBjbnQrKykgeworCWZvciAoY250ID0gMDsgY250IDwgMjsgY250KyspIHsKIAkJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IHdyaXRlX2RzdCBlcnJvciAoZXJyID09ICVpLCBsZW4gPT0gMHglMDJ4LCBiMCA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgbGVuLCBkYXRhWzBdKTsKLQkJCWRzdF9pMmNfZGlzYWJsZShzdGF0ZSk7Ci0JCQltc2xlZXAoNTAwKTsKLQkJCWRzdF9pMmNfZW5hYmxlKHN0YXRlKTsKLQkJCW1zbGVlcCg1MDApOworCQkJZHByaW50aygiJXM6IF93cml0ZV9kc3QgZXJyb3IgKGVyciA9PSAlaSwgbGVuID09IDB4JTAyeCwgYjAgPT0gMHglMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIGxlbiwgZGF0YVswXSk7CisJCQlkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpOwogCQkJY29udGludWU7CiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQotCWlmIChjbnQgPj0gNCkKLQkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlpZiAoY250ID49IDIpIHsKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJcHJpbnRrKCIlczogUkRDIDg4MjAgUkVTRVQuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRzdF9lcnJvcl9iYWlsb3V0KHN0YXRlKTsKKworCQlyZXR1cm4gLTE7CisJfQorCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHdyaXRlX2RzdCk7CiAKLXN0YXRpYyBpbnQgcmVhZF9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmV0LCB1OCBsZW4pCitpbnQgcmVhZF9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmV0LCB1OCBsZW4pCiB7CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSBJMkNfTV9SRCwuYnVmID0gcmV0LC5sZW4gPSBsZW4gfTsKIAlpbnQgZXJyOwogCWludCBjbnQ7CiAKLQlmb3IgKGNudCA9IDA7IGNudCA8IDQ7IGNudCsrKSB7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykgewogCQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgPCAwKSB7CisKIAkJCWRwcmludGsoIiVzOiByZWFkX2RzdCBlcnJvciAoZXJyID09ICVpLCBsZW4gPT0gMHglMDJ4LCBiMCA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgbGVuLCByZXRbMF0pOwotCQkJZHN0X2kyY19kaXNhYmxlKHN0YXRlKTsKLQkJCWRzdF9pMmNfZW5hYmxlKHN0YXRlKTsKKwkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CisKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UKIAkJCWJyZWFrOwogCX0KLQlpZiAoY250ID49IDQpCi0JCXJldHVybiAtRVJFTU9URUlPOwotCWRwcmludGsoIiVzIHJlcGx5IGlzIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgcmV0WzBdKTsKLQlpZiAoZHN0X2RlYnVnICYmIGRzdF92ZXJib3NlKSB7CisJaWYgKGNudCA+PSAyKSB7CisJCWlmICh2ZXJib3NlID4gMSkKKwkJCXByaW50aygiJXM6IFJEQyA4ODIwIFJFU0VULi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7CisKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZGVidWcgJiYgKHZlcmJvc2UgPiA0KSkgeworCQlkcHJpbnRrKCIlcyByZXBseSBpcyAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIHJldFswXSk7CiAJCWZvciAoZXJyID0gMTsgZXJyIDwgbGVuOyBlcnIrKykKIAkJCWRwcmludGsoIiAweCV4IiwgcmV0W2Vycl0pOwogCQlpZiAoZXJyID4gMSkKIAkJCWRwcmludGsoIlxuIik7CiAJfQorCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHJlYWRfZHN0KTsKIAogc3RhdGljIGludCBkc3Rfc2V0X2ZyZXEoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHUzMiBmcmVxKQogewogCXU4ICp2YWw7CiAKIAlzdGF0ZS0+ZnJlcXVlbmN5ID0gZnJlcTsKKwlpZiAoZGVidWcgPiA0KQorCQlkcHJpbnRrKCIlczogc2V0IEZyZXF1ZW5jeSAldVxuIiwgX19GVU5DVElPTl9fLCBmcmVxKTsKIAotCS8vIGRwcmludGsoIiVzOiBzZXQgZnJlcXVlbmN5ICV1XG4iLCBfX0ZVTkNUSU9OX18sIGZyZXEpOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJaWYgKGZyZXEgPCA5NTAgfHwgZnJlcSA+IDIxNTApCkBAIC0zOTgsNyArNDUwLDggQEAKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKIAkJcmV0dXJuIDA7CiAJfQotCS8vIGRwcmludGsoIiVzOiBzZXQgc3JhdGUgJXVcbiIsIF9fRlVOQ1RJT05fXywgc3JhdGUpOworCWlmIChkZWJ1ZyA+IDQpCisJCWRwcmludGsoIiVzOiBzZXQgc3ltcmF0ZSAldVxuIiwgX19GVU5DVElPTl9fLCBzcmF0ZSk7CiAJc3JhdGUgLz0gMTAwMDsKIAl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07CiAKQEAgLTQwNyw3ICs0NjAsMTAgQEAKIAkJc3ZhbCA8PD0gMjA7CiAJCWRvX2RpdihzdmFsLCA4ODAwMCk7CiAJCXN5bWNhbGMgPSAodTMyKSBzdmFsOwotCQkvLyBkcHJpbnRrKCIlczogc2V0IHN5bWNhbGMgJXVcbiIsIF9fRlVOQ1RJT05fXywgc3ltY2FsYyk7CisKKwkJaWYgKGRlYnVnID4gNCkKKwkJCWRwcmludGsoIiVzOiBzZXQgc3ltY2FsYyAldVxuIiwgX19GVU5DVElPTl9fLCBzeW1jYWxjKTsKKwogCQl2YWxbNV0gPSAodTgpIChzeW1jYWxjID4+IDEyKTsKIAkJdmFsWzZdID0gKHU4KSAoc3ltY2FsYyA+PiA0KTsKIAkJdmFsWzddID0gKHU4KSAoc3ltY2FsYyA8PCA0KTsKQEAgLTQyMiw3ICs0NzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggZHN0X2NoZWNrX3N1bSh1OCAqIGJ1ZiwgdTMyIGxlbikKK3U4IGRzdF9jaGVja19zdW0odTggKiBidWYsIHUzMiBsZW4pCiB7CiAJdTMyIGk7CiAJdTggdmFsID0gMDsKQEAgLTQzMywyOCArNDg5LDcgQEAKIAl9CiAJcmV0dXJuICgofnZhbCkgKyAxKTsKIH0KLQotc3RydWN0IGRzdF90eXBlcyB7Ci0JY2hhciAqbXN0cjsKLQlpbnQgb2ZmczsKLQl1OCBkc3RfdHlwZTsKLQl1MzIgdHlwZV9mbGFnczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X3R5cGVzIGRzdF90bGlzdFtdID0gewotCXsiRFNULTAyMCIsIDAsIERTVF9UWVBFX0lTX1NBVCwgRFNUX1RZUEVfSEFTX1NZTURJVn0sCi0JeyJEU1QtMDMwIiwgMCwgRFNUX1RZUEVfSVNfU0FULCBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORX0sCi0JeyJEU1QtMDNUIiwgMCwgRFNUX1RZUEVfSVNfU0FULCBEU1RfVFlQRV9IQVNfU1lNRElWIHwgRFNUX1RZUEVfSEFTX1RTMjA0fSwKLQl7IkRTVC1NT1QiLCAwLCBEU1RfVFlQRV9JU19TQVQsIERTVF9UWVBFX0hBU19TWU1ESVZ9LAotCXsiRFNULUNJIiwgIDEsIERTVF9UWVBFX0lTX1NBVCwgRFNUX1RZUEVfSEFTX1RTMjA0IHwgRFNUX1RZUEVfSEFTX05FV1RVTkV9LAotCXsiRFNUTUNJIiwgIDEsIERTVF9UWVBFX0lTX1NBVCwgRFNUX1RZUEVfSEFTX05FV1RVTkV9LAotCXsiRFNURkNJIiwgIDEsIERTVF9UWVBFX0lTX1NBVCwgRFNUX1RZUEVfSEFTX05FV1RVTkV9LAotCXsiRENUTkVXIiwgIDEsIERTVF9UWVBFX0lTX0NBQkxFLCBEU1RfVFlQRV9IQVNfTkVXVFVORX0sCi0JeyJEQ1QtQ0kiLCAgMSwgRFNUX1RZUEVfSVNfQ0FCTEUsIERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX1RTMjA0fSwKLQl7IkRUVERJRyIsICAxLCBEU1RfVFlQRV9JU19URVJSLCAwfQotfTsKLQotLyogRENUTkVXIGFuZCBEQ1QtQ0kgYXJlIGd1ZXNzZXMgKi8KK0VYUE9SVF9TWU1CT0woZHN0X2NoZWNrX3N1bSk7CiAKIHN0YXRpYyB2b2lkIGRzdF90eXBlX2ZsYWdzX3ByaW50KHUzMiB0eXBlX2ZsYWdzKQogewpAQCAtNDY1LDkzICs1MDAsMjcwIEBACiAJCXByaW50aygiIDB4JXggdHMyMDQiLCBEU1RfVFlQRV9IQVNfVFMyMDQpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikKIAkJcHJpbnRrKCIgMHgleCBzeW1kaXYiLCBEU1RfVFlQRV9IQVNfU1lNRElWKTsKKwlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQorCQlwcmludGsoIiAweCV4IGZpcm13YXJlIHZlcnNpb24gPSAxIiwgRFNUX1RZUEVfSEFTX0ZXXzEpOworCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzIpCisJCXByaW50aygiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDIiLCBEU1RfVFlQRV9IQVNfRldfMik7CisJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMykKKwkJcHJpbnRrKCIgMHgleCBmaXJtd2FyZSB2ZXJzaW9uID0gMyIsIERTVF9UWVBFX0hBU19GV18zKTsKKy8vCWlmICgodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV19CVUlMRCkgJiYgbmV3X2Z3KQorCiAJcHJpbnRrKCJcbiIpOwogfQogCi1zdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHU4IHR5cGUpCisKK3N0YXRpYyBpbnQgZHN0X3R5cGVfcHJpbnQgKHU4IHR5cGUpCiB7CiAJY2hhciAqb3R5cGU7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBEU1RfVFlQRV9JU19TQVQ6CiAJCW90eXBlID0gInNhdGVsbGl0ZSI7CiAJCWJyZWFrOworCiAJY2FzZSBEU1RfVFlQRV9JU19URVJSOgogCQlvdHlwZSA9ICJ0ZXJyZXN0cmlhbCI7CiAJCWJyZWFrOworCiAJY2FzZSBEU1RfVFlQRV9JU19DQUJMRToKIAkJb3R5cGUgPSAiY2FibGUiOwogCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXByaW50aygiJXM6IGludmFsaWQgZHN0IHR5cGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlwcmludGsoIkRTVCB0eXBlIDogJXNcbiIsIG90eXBlKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9jaGVja19jaShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKKy8qCisJS25vd24gY2FyZHMgbGlzdAorCVNhdGVsbGl0ZQorCS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAyMDAxMDNBCisJVlAtMTAyMCAgIERTVC1NT1QJTEcob2xkKSwgVFM9MTg4CisKKwlWUC0xMDIwICAgRFNULTAzVAlMRyhuZXcpLCBUUz0yMDQKKwlWUC0xMDIyICAgRFNULTAzVAlMRyhuZXcpLCBUUz0yMDQKKwlWUC0xMDI1ICAgRFNULTAzVAlMRyhuZXcpLCBUUz0yMDQKKworCVZQLTEwMzAgICBEU1RNQ0ksCUxHKG5ldyksIFRTPTE4OAorCVZQLTEwMzIgICBEU1RNQ0ksCUxHKG5ldyksIFRTPTE4OAorCisJQ2FibGUKKwktLS0tLS0tLS0tLS0tLS0tLS0tCisJVlAtMjAzMCAgIERDVC1DSSwJU2Ftc3VuZywgVFM9MjA0CisJVlAtMjAyMSAgIERDVC1DSSwJVW5rbm93biwgVFM9MjA0CisJVlAtMjAzMSAgIERDVC1DSSwJUGhpbGlwcywgVFM9MTg4CisJVlAtMjA0MCAgIERDVC1DSSwJUGhpbGlwcywgVFM9MTg4LCB3aXRoIENBIGRhdWdodGVyIGJvYXJkCisJVlAtMjA0MCAgIERDVC1DSSwJUGhpbGlwcywgVFM9MjA0LCB3aXRob3V0IENBIGRhdWdodGVyIGJvYXJkCisKKwlUZXJyZXN0cmlhbAorCS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlWUC0zMDUwICBEVFROWFQJCQkgVFM9MTg4CisJVlAtMzA0MCAgRFRULUNJLAlQaGlsaXBzLCBUUz0xODgKKwlWUC0zMDQwICBEVFQtQ0ksCVBoaWxpcHMsIFRTPTIwNAorCisJQVRTQworCS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlWUC0zMjIwICBBVFNDREksCQkgVFM9MTg4CisJVlAtMzI1MCAgQVRTQ0FELAkJIFRTPTE4OAorCisqLworCitzdHJ1Y3QgZHN0X3R5cGVzIGRzdF90bGlzdFtdID0geworCXsKKwkJLmRldmljZV9pZCA9ICIyMDAxMDNBIiwKKwkJLm9mZnNldCA9IDAsCisJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAorCQkuZHN0X2ZlYXR1cmUgPSAwCisJfSwJLyoJb2Jzb2xldGUJKi8KKworCXsKKwkJLmRldmljZV9pZCA9ICJEU1QtMDIwIiwKKwkJLm9mZnNldCA9IDAsCisJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAorCQkuZHN0X2ZlYXR1cmUgPSAwCisJfSwJLyoJb2Jzb2xldGUJKi8KKworCXsKKwkJLmRldmljZV9pZCA9ICJEU1QtMDMwIiwKKwkJLm9mZnNldCA9ICAwLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1RTMjA0IHwgRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMSwKKwkJLmRzdF9mZWF0dXJlID0gMAorCX0sCS8qCW9ic29sZXRlCSovCisKKwl7CisJCS5kZXZpY2VfaWQgPSAiRFNULTAzVCIsCisJCS5vZmZzZXQgPSAwLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19GV18yLAorCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfRElTRVFDMyB8IERTVF9UWVBFX0hBU19ESVNFUUM0IHwgRFNUX1RZUEVfSEFTX0RJU0VRQzUKKwkJCQkJCQkgfCBEU1RfVFlQRV9IQVNfTUFDIHwgRFNUX1RZUEVfSEFTX01PVE8KKwkgfSwKKworCXsKKwkJLmRldmljZV9pZCA9ICJEU1QtTU9UIiwKKwkJLm9mZnNldCA9ICAwLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAorCQkuZHN0X2ZlYXR1cmUgPSAwCisJfSwJLyoJb2Jzb2xldGUJKi8KKworCXsKKwkJLmRldmljZV9pZCA9ICJEU1QtQ0kiLAorCQkub2Zmc2V0ID0gMSwKKwkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzEsCisJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQQorCX0sCS8qCUFuIE9FTSBib2FyZAkqLworCisJeworCQkuZGV2aWNlX2lkID0gIkRTVE1DSSIsCisJCS5vZmZzZXQgPSAxLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBIHwgRFNUX1RZUEVfSEFTX0RJU0VRQzMgfCBEU1RfVFlQRV9IQVNfRElTRVFDNAorCQkJCQkJCXwgRFNUX1RZUEVfSEFTX01PVE8gfCBEU1RfVFlQRV9IQVNfTUFDCisJfSwKKworCXsKKwkJLmRldmljZV9pZCA9ICJEU1RGQ0kiLAorCQkub2Zmc2V0ID0gMSwKKwkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzEsCisJCS5kc3RfZmVhdHVyZSA9IDAKKwl9LAkvKiB1bmtub3duIHRvIHZlbmRvcgkqLworCisJeworCQkuZGV2aWNlX2lkID0gIkRDVC1DSSIsCisJCS5vZmZzZXQgPSAxLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19DQUJMRSwKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xCisJCQkJCQkJfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBCisJfSwKKworCXsKKwkJLmRldmljZV9pZCA9ICJEQ1RORVciLAorCQkub2Zmc2V0ID0gMSwKKwkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfQ0FCTEUsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMywKKwkJLmRzdF9mZWF0dXJlID0gMAorCX0sCisKKwl7CisJCS5kZXZpY2VfaWQgPSAiRFRULUNJIiwKKwkJLm9mZnNldCA9IDEsCisJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1RFUlIsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1RTMjA0IHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQsCisJCS5kc3RfZmVhdHVyZSA9IDAKKwl9LAorCisJeworCQkuZGV2aWNlX2lkID0gIkRUVERJRyIsCisJCS5vZmZzZXQgPSAxLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19URVJSLAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAorCQkuZHN0X2ZlYXR1cmUgPSAwCisJfSwKKworCXsKKwkJLmRldmljZV9pZCA9ICJEVFROWFQiLAorCQkub2Zmc2V0ID0gMSwKKwkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfVEVSUiwKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfRldfMiwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0FOQUxPRworCX0sCisKKwl7CisJCS5kZXZpY2VfaWQgPSAiQVRTQ0RJIiwKKwkJLm9mZnNldCA9IDEsCisJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX0FUU0MsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX0ZXXzIsCisJCS5kc3RfZmVhdHVyZSA9IDAKKwl9LAorCisJeworCQkuZGV2aWNlX2lkID0gIkFUU0NBRCIsCisJCS5vZmZzZXQgPSAxLAorCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19BVFNDLAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAorCQkuZHN0X2ZlYXR1cmUgPSAwCisJfSwKKworCXsgfQorCit9OworCisKK3N0YXRpYyBpbnQgZHN0X2dldF9kZXZpY2VfaWQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JdTggdHhidWZbOF07Ci0JdTggcnhidWZbOF07Ci0JaW50IHJldHZhbDsKKwl1OCByZXBseTsKKwogCWludCBpOwotCXN0cnVjdCBkc3RfdHlwZXMgKmRzcDsKLQl1OCB1c2VfZHN0X3R5cGU7Ci0JdTMyIHVzZV90eXBlX2ZsYWdzOworCXN0cnVjdCBkc3RfdHlwZXMgKnBfZHN0X3R5cGU7CisJdTggdXNlX2RzdF90eXBlID0gMDsKKwl1MzIgdXNlX3R5cGVfZmxhZ3MgPSAwOwogCi0JbWVtc2V0KHR4YnVmLCAwLCBzaXplb2YodHhidWYpKTsKLQl0eGJ1ZlsxXSA9IDY7Ci0JdHhidWZbN10gPSBkc3RfY2hlY2tfc3VtKHR4YnVmLCA3KTsKKwlzdGF0aWMgdTggZGV2aWNlX3R5cGVbOF0gPSB7MHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZn07CiAKLQlkc3RfaTJjX2VuYWJsZShzdGF0ZSk7Ci0JZHN0X3Jlc2V0ODgyMChzdGF0ZSk7Ci0JcmV0dmFsID0gd3JpdGVfZHN0KHN0YXRlLCB0eGJ1ZiwgOCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZHN0X2kyY19kaXNhYmxlKHN0YXRlKTsKLQkJZHByaW50aygiJXM6IHdyaXRlIG5vdCBzdWNjZXNzZnVsLCBtYXliZSBubyBjYXJkP1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIHJldHZhbDsKKwlkZXZpY2VfdHlwZVs3XSA9IGRzdF9jaGVja19zdW0oZGV2aWNlX3R5cGUsIDcpOworCisJaWYgKHdyaXRlX2RzdChzdGF0ZSwgZGV2aWNlX3R5cGUsIEZJWEVEX0NPTU0pKQorCQlyZXR1cm4gLTE7CQkvKglXcml0ZSBmYWlsZWQJCSovCisKKwlpZiAoKGRzdF9waW9fZGlzYWJsZShzdGF0ZSkpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spKQorCQlyZXR1cm4gLTE7CQkvKglSZWFkIGZhaWx1cmUJCSovCisKKwlpZiAocmVwbHkgIT0gQUNLKSB7CisJCWRwcmludGsoIiVzOiBXcml0ZSBub3QgQWNrbm93bGVkZ2VkISBbUmVwbHk9MHglMDJ4XVxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7CisJCXJldHVybiAtMTsJCS8qCVVuYWNrJ2Qgd3JpdGUJCSovCiAJfQotCW1zbGVlcCgzKTsKLQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgcnhidWYsIDEpOwotCWRzdF9pMmNfZGlzYWJsZShzdGF0ZSk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZHByaW50aygiJXM6IHJlYWQgbm90IHN1Y2Nlc3NmdWwsIG1heWJlIG5vIGNhcmQ/XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIERFVklDRV9JTklUKSkKKwkJcmV0dXJuIC0xOwkJLyoJRFNUIG5vdCByZWFkeSB5ZXQJKi8KKworCWlmIChyZWFkX2RzdChzdGF0ZSwgc3RhdGUtPnJ4YnVmZmVyLCBGSVhFRF9DT01NKSkKKwkJcmV0dXJuIC0xOworCisJZHN0X3Bpb19kaXNhYmxlKHN0YXRlKTsKKworCWlmIChzdGF0ZS0+cnhidWZmZXJbN10gIT0gZHN0X2NoZWNrX3N1bShzdGF0ZS0+cnhidWZmZXIsIDcpKSB7CisJCWRwcmludGsoIiVzOiBDaGVja3N1bSBmYWlsdXJlISBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsJCS8qCUNoZWNrc3VtIGZhaWx1cmUJKi8KIAl9Ci0JaWYgKHJ4YnVmWzBdICE9IDB4ZmYpIHsKLQkJZHByaW50aygiJXM6IHdyaXRlIHJlcGx5IG5vdCAweGZmLCBub3QgY2kgKCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIHJ4YnVmWzBdKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUpKQotCQlyZXR1cm4gMDsKLQkvLyBkc3RfaTJjX2VuYWJsZShpMmMpOyBEaW1pdHJpCi0JcmV0dmFsID0gcmVhZF9kc3Qoc3RhdGUsIHJ4YnVmLCA4KTsKLQlkc3RfaTJjX2Rpc2FibGUoc3RhdGUpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkIG5vdCBzdWNjZXNzZnVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlpZiAocnhidWZbN10gIT0gZHN0X2NoZWNrX3N1bShyeGJ1ZiwgNykpIHsKLQkJZHByaW50aygiJXM6IGNoZWNrc3VtIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXJ4YnVmWzddID0gJ1wwJzsKLQlmb3IgKGkgPSAwLCBkc3AgPSAmZHN0X3RsaXN0WzBdOyBpIDwgc2l6ZW9mKGRzdF90bGlzdCkgLyBzaXplb2YoZHN0X3RsaXN0WzBdKTsgaSsrLCBkc3ArKykgewotCQlpZiAoIXN0cm5jbXAoJnJ4YnVmW2RzcC0+b2Zmc10sIGRzcC0+bXN0ciwgc3RybGVuKGRzcC0+bXN0cikpKSB7Ci0JCQl1c2VfdHlwZV9mbGFncyA9IGRzcC0+dHlwZV9mbGFnczsKLQkJCXVzZV9kc3RfdHlwZSA9IGRzcC0+ZHN0X3R5cGU7Ci0JCQlwcmludGsoIiVzOiByZWNvZ25pemUgJXNcbiIsIF9fRlVOQ1RJT05fXywgZHNwLT5tc3RyKTsKKworCXN0YXRlLT5yeGJ1ZmZlcls3XSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwLCBwX2RzdF90eXBlID0gZHN0X3RsaXN0OyBpIDwgQVJSQVlfU0laRSAoZHN0X3RsaXN0KTsgaSsrLCBwX2RzdF90eXBlKyspIHsKKwkJaWYgKCFzdHJuY21wICgmc3RhdGUtPnJ4YnVmZmVyW3BfZHN0X3R5cGUtPm9mZnNldF0sIHBfZHN0X3R5cGUtPmRldmljZV9pZCwgc3RybGVuIChwX2RzdF90eXBlLT5kZXZpY2VfaWQpKSkgeworCQkJdXNlX3R5cGVfZmxhZ3MgPSBwX2RzdF90eXBlLT50eXBlX2ZsYWdzOworCQkJdXNlX2RzdF90eXBlID0gcF9kc3RfdHlwZS0+ZHN0X3R5cGU7CisKKwkJCS8qCUNhcmQgY2FwYWJpbGl0aWVzCSovCisJCQlzdGF0ZS0+ZHN0X2h3X2NhcCA9IHBfZHN0X3R5cGUtPmRzdF9mZWF0dXJlOworCQkJcHJpbnRrICgiJXM6IFJlY29nbmlzZSBbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHBfZHN0X3R5cGUtPmRldmljZV9pZCk7CisKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChpID49IHNpemVvZihkc3RfdGxpc3QpIC8gc2l6ZW9mKGRzdF90bGlzdFswXSkpIHsKLQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIHJlY29nbml6ZSAlcyBvciAlc1xuIiwgX19GVU5DVElPTl9fLCAmcnhidWZbMF0sICZyeGJ1ZlsxXSk7Ci0JCXByaW50aygiJXMgcGxlYXNlIGVtYWlsIGxpbnV4LWR2YkBsaW51eHR2Lm9yZyB3aXRoIHRoaXMgdHlwZSBpblxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChpID49IHNpemVvZiAoZHN0X3RsaXN0KSAvIHNpemVvZiAoZHN0X3RsaXN0IFswXSkpIHsKKwkJcHJpbnRrKCIlczogVW5hYmxlIHRvIHJlY29nbml6ZSAlcyBvciAlc1xuIiwgX19GVU5DVElPTl9fLCAmc3RhdGUtPnJ4YnVmZmVyWzBdLCAmc3RhdGUtPnJ4YnVmZmVyWzFdKTsKKwkJcHJpbnRrKCIlczogcGxlYXNlIGVtYWlsIGxpbnV4LWR2YkBsaW51eHR2Lm9yZyB3aXRoIHRoaXMgdHlwZSBpblxuIiwgX19GVU5DVElPTl9fKTsKIAkJdXNlX2RzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FUOwogCQl1c2VfdHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19TWU1ESVY7CiAJfQotCWRzdF90eXBlX3ByaW50KHVzZV9kc3RfdHlwZSk7CiAKKwlkc3RfdHlwZV9wcmludCh1c2VfZHN0X3R5cGUpOwogCXN0YXRlLT50eXBlX2ZsYWdzID0gdXNlX3R5cGVfZmxhZ3M7CiAJc3RhdGUtPmRzdF90eXBlID0gdXNlX2RzdF90eXBlOwogCWRzdF90eXBlX2ZsYWdzX3ByaW50KHN0YXRlLT50eXBlX2ZsYWdzKTsKQEAgLTU1OSw1MCArNzcxLDEwMiBAQAogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19UUzIwNCkgewogCQlkc3RfcGFja3NpemUoc3RhdGUsIDIwNCk7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X2NvbW1hbmQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHU4ICogZGF0YSwgdTggbGVuKQorc3RhdGljIGludCBkc3RfcHJvYmUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JaW50IHJldHZhbDsKLQl1OCByZXBseTsKKwlpZiAoKHJkY184ODIwX3Jlc2V0KHN0YXRlKSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBSREMgODgyMCBSRVNFVCBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChkc3RfYWRkb25zICYgRFNUX1RZUEVfSEFTX0NBKQorCQltc2xlZXAoNDAwMCk7CisJZWxzZQorCQltc2xlZXAoMTAwKTsKIAotCWRzdF9pMmNfZW5hYmxlKHN0YXRlKTsKLQlkc3RfcmVzZXQ4ODIwKHN0YXRlKTsKLQlyZXR2YWwgPSB3cml0ZV9kc3Qoc3RhdGUsIGRhdGEsIGxlbik7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZHN0X2kyY19kaXNhYmxlKHN0YXRlKTsKLQkJZHByaW50aygiJXM6IHdyaXRlIG5vdCBzdWNjZXNzZnVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gcmV0dmFsOworCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogRFNUIEluaXRpYWxpemF0aW9uIEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKIAl9Ci0JbXNsZWVwKDMzKTsKLQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgJnJlcGx5LCAxKTsKLQlkc3RfaTJjX2Rpc2FibGUoc3RhdGUpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkIHZlcmlmeSAgbm90IHN1Y2Nlc3NmdWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiByZXR2YWw7CisJbXNsZWVwKDEwMCk7CisJaWYgKGRzdF9nZXRfZGV2aWNlX2lkKHN0YXRlKSA8IDApIHsKKwkJZHByaW50aygiJXM6IHVua25vd24gZGV2aWNlLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOwogCX0KLQlpZiAocmVwbHkgIT0gMHhmZikgewotCQlkcHJpbnRrKCIlczogd3JpdGUgcmVwbHkgbm90IDB4ZmYgMHglMDJ4IFxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7Ci0JCXJldHVybiAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc3RfY29tbWFuZChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgdTggKiBkYXRhLCB1OCBsZW4pCit7CisJdTggcmVwbHk7CisJaWYgKChkc3RfY29tbV9pbml0KHN0YXRlKSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBEU1QgQ29tbXVuaWNhdGlvbiBJbml0aWFsaXphdGlvbiBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHdyaXRlX2RzdChzdGF0ZSwgZGF0YSwgbGVuKSkgeworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlkcHJpbnRrKCIlczogVHJpbmcgdG8gcmVjb3Zlci4uIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKChkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpKSA8IDApIHsKKwkJCWRwcmludGsoIiVzOiBSZWNvdmVyeSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJaWYgKChkc3RfcGlvX2Rpc2FibGUoc3RhdGUpKSA8IDApIHsKKwkJZHByaW50aygiJXM6IFBJTyBEaXNhYmxlIEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCisJCXVkZWxheSgzMDAwKTsKKworCWlmIChyZWFkX2RzdChzdGF0ZSwgJnJlcGx5LCBHRVRfQUNLKSkgeworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlkcHJpbnRrKCIlczogVHJ5aW5nIHRvIHJlY292ZXIuLiBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmICgoZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKSkgPCAwKSB7CisJCQlkcHJpbnRrKCIlczogUmVjb3ZlcnkgRmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJlcGx5ICE9IEFDSykgeworCQlkcHJpbnRrKCIlczogd3JpdGUgbm90IGFja25vd2xlZGdlZCAweCUwMnggXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKKwkJcmV0dXJuIC0xOwogCX0KIAlpZiAobGVuID49IDIgJiYgZGF0YVswXSA9PSAwICYmIChkYXRhWzFdID09IDEgfHwgZGF0YVsxXSA9PSAzKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUpKQotCQlyZXR1cm4gMDsKLQkvLyBkc3RfaTJjX2VuYWJsZShpMmMpOyBQZXIgZGltaXRyaQotCXJldHZhbCA9IHJlYWRfZHN0KHN0YXRlLCBzdGF0ZS0+cnhidWZmZXIsIDgpOwotCWRzdF9pMmNfZGlzYWJsZShzdGF0ZSk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZHByaW50aygiJXM6IHJlYWQgbm90IHN1Y2Nlc3NmdWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAwOworCisvLwl1ZGVsYXkoMzAwMCk7CisJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCisJCXVkZWxheSgzMDAwKTsKKwllbHNlCisJCXVkZWxheSgyMDAwKTsKKworCWlmICghZHN0X3dhaXRfZHN0X3JlYWR5KHN0YXRlLCBOT19ERUxBWSkpCisJCXJldHVybiAtMTsKKworCWlmIChyZWFkX2RzdChzdGF0ZSwgc3RhdGUtPnJ4YnVmZmVyLCBGSVhFRF9DT01NKSkgeworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlkcHJpbnRrKCIlczogVHJ5aW5nIHRvIHJlY292ZXIuLiBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmICgoZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKSkgPCAwKSB7CisJCQlkcHJpbnRrKCIlczogUmVjb3ZlcnkgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gLTE7CiAJfQorCiAJaWYgKHN0YXRlLT5yeGJ1ZmZlcls3XSAhPSBkc3RfY2hlY2tfc3VtKHN0YXRlLT5yeGJ1ZmZlciwgNykpIHsKIAkJZHByaW50aygiJXM6IGNoZWNrc3VtIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLTE7CiAJfQorCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRzdF9jb21tYW5kKTsKIAogc3RhdGljIGludCBkc3RfZ2V0X3NpZ25hbChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSkKIHsKQEAgLTY0NiwxMSArOTEwLDE3IEBACiAJCXBha2V0WzRdID0gMDsKIAllbHNlCiAJCXBha2V0WzRdID0gMTsKKwogCWlmIChzdGF0ZS0+dG9uZSA9PSBTRUNfVE9ORV9PTikKLQkJcGFrZXRbMl0gPSBzdGF0ZS0+azIyOworCQlwYWtldFsyXSA9IDB4MDI7CiAJZWxzZQogCQlwYWtldFsyXSA9IDA7Ci0JcGFrZXRbN10gPSBkc3RfY2hlY2tfc3VtKCZwYWtldFswXSwgNyk7CisJaWYgKHN0YXRlLT5taW5pY21kID09IFNFQ19NSU5JX0EpCisJCXBha2V0WzNdID0gMHgwMjsKKwllbHNlCisJCXBha2V0WzNdID0gMDsKKworCXBha2V0WzddID0gZHN0X2NoZWNrX3N1bSAocGFrZXQsIDcpOwogCWRzdF9jb21tYW5kKHN0YXRlLCBwYWtldCwgOCk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NTgsMjEgKzkyOCwyNiBAQAogc3RhdGljIGludCBkc3RfZ2V0X3R1bmEoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpCiB7CiAJaW50IHJldHZhbDsKKwogCWlmICgoc3RhdGUtPmRpc2VxX2ZsYWdzICYgQVRURU1QVF9UVU5FKSA9PSAwKQogCQlyZXR1cm4gMDsKKwogCXN0YXRlLT5kaXNlcV9mbGFncyAmPSB+KEhBU19MT0NLKTsKLQlpZiAoIWRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSkpCisJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIE5PX0RFTEFZKSkKIAkJcmV0dXJuIDA7CisKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgewogCQkvKiBob3cgdG8gZ2V0IHZhcmlhYmxlIGxlbmd0aCByZXBseSA/Pz8/ICovCiAJCXJldHZhbCA9IHJlYWRfZHN0KHN0YXRlLCBzdGF0ZS0+cnhfdHVuYSwgMTApOwogCX0gZWxzZSB7Ci0JCXJldHZhbCA9IHJlYWRfZHN0KHN0YXRlLCAmc3RhdGUtPnJ4X3R1bmFbMl0sIDgpOworCQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgJnN0YXRlLT5yeF90dW5hWzJdLCBGSVhFRF9DT01NKTsKIAl9CisKIAlpZiAocmV0dmFsIDwgMCkgewogCQlkcHJpbnRrKCIlczogcmVhZCBub3Qgc3VjY2Vzc2Z1bFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQorCiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKIAkJaWYgKHN0YXRlLT5yeF90dW5hWzldICE9IGRzdF9jaGVja19zdW0oJnN0YXRlLT5yeF90dW5hWzBdLCA5KSkgewogCQkJZHByaW50aygiJXM6IGNoZWNrc3VtIGZhaWx1cmU/XG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNzA5LDcgKzk4NCw5IEBACiAJaW50IHJldHZhbDsKIAl1OCByZXBseTsKIAotCWRwcmludGsoIiVzOiB0eXBlX2ZsYWdzIDB4JXggXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlLT50eXBlX2ZsYWdzKTsKKwlpZiAoZGVidWcgPiA0KQorCQlkcHJpbnRrKCIlczogdHlwZV9mbGFncyAweCV4IFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZS0+dHlwZV9mbGFncyk7CisKIAlzdGF0ZS0+ZGVjb2RlX2ZyZXEgPSAwOwogCXN0YXRlLT5kZWNvZGVfbG9jayA9IHN0YXRlLT5kZWNvZGVfc3RyZW5ndGggPSBzdGF0ZS0+ZGVjb2RlX3NuciA9IDA7CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKQEAgLTcxNywzMiArOTk0LDQxIEBACiAJCQlkc3Rfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFXzEzKTsKIAl9CiAJc3RhdGUtPmRpc2VxX2ZsYWdzICY9IH4oSEFTX0xPQ0sgfCBBVFRFTVBUX1RVTkUpOwotCWRzdF9pMmNfZW5hYmxlKHN0YXRlKTsKKworCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogRFNUIENvbW11bmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSB7Ci0JCWRzdF9yZXNldDg4MjAoc3RhdGUpOwogCQlzdGF0ZS0+dHhfdHVuYVs5XSA9IGRzdF9jaGVja19zdW0oJnN0YXRlLT50eF90dW5hWzBdLCA5KTsKIAkJcmV0dmFsID0gd3JpdGVfZHN0KHN0YXRlLCAmc3RhdGUtPnR4X3R1bmFbMF0sIDEwKTsKKwogCX0gZWxzZSB7CiAJCXN0YXRlLT50eF90dW5hWzldID0gZHN0X2NoZWNrX3N1bSgmc3RhdGUtPnR4X3R1bmFbMl0sIDcpOwotCQlyZXR2YWwgPSB3cml0ZV9kc3Qoc3RhdGUsICZzdGF0ZS0+dHhfdHVuYVsyXSwgOCk7CisJCXJldHZhbCA9IHdyaXRlX2RzdChzdGF0ZSwgJnN0YXRlLT50eF90dW5hWzJdLCBGSVhFRF9DT01NKTsKIAl9CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJZHN0X2kyY19kaXNhYmxlKHN0YXRlKTsKKwkJZHN0X3Bpb19kaXNhYmxlKHN0YXRlKTsKIAkJZHByaW50aygiJXM6IHdyaXRlIG5vdCBzdWNjZXNzZnVsXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQltc2xlZXAoMyk7Ci0JcmV0dmFsID0gcmVhZF9kc3Qoc3RhdGUsICZyZXBseSwgMSk7Ci0JZHN0X2kyY19kaXNhYmxlKHN0YXRlKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkcHJpbnRrKCIlczogcmVhZCB2ZXJpZnkgIG5vdCBzdWNjZXNzZnVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKChkc3RfcGlvX2Rpc2FibGUoc3RhdGUpKSA8IDApIHsKKwkJZHByaW50aygiJXM6IERTVCBQSU8gZGlzYWJsZSBmYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOwogCX0KLQlpZiAocmVwbHkgIT0gMHhmZikgewotCQlkcHJpbnRrKCIlczogd3JpdGUgcmVwbHkgbm90IDB4ZmYgMHglMDJ4IFxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7CisKKwlpZiAoKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spIDwgMCkpIHsKKwkJZHByaW50aygiJXM6IHJlYWQgdmVyaWZ5IG5vdCBzdWNjZXNzZnVsLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocmVwbHkgIT0gQUNLKSB7CisJCWRwcmludGsoIiVzOiB3cml0ZSBub3QgYWNrbm93bGVkZ2VkIDB4JTAyeCBcbiIsIF9fRlVOQ1RJT05fXywgcmVwbHkpOwogCQlyZXR1cm4gMDsKIAl9CiAJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEFUVEVNUFRfVFVORTsKKwogCXJldHVybiBkc3RfZ2V0X3R1bmEoc3RhdGUpOwogfQogCkBAIC03OTYsMjIgKzEwODIsMjUgQEAKIAkJCW5lZWRfY21kID0gMTsKIAkJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEhBU19QT1dFUjsKIAkJYnJlYWs7CisKIAljYXNlIFNFQ19WT0xUQUdFXzE4OgogCQlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEhBU19QT1dFUikgPT0gMCkKIAkJCW5lZWRfY21kID0gMTsKIAkJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEhBU19QT1dFUjsKIAkJdmFsWzhdIHw9IDB4NDA7CiAJCWJyZWFrOworCiAJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CiAJCW5lZWRfY21kID0gMTsKIAkJc3RhdGUtPmRpc2VxX2ZsYWdzICY9IH4oSEFTX1BPV0VSIHwgSEFTX0xPQ0sgfCBBVFRFTVBUX1RVTkUpOwogCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAobmVlZF9jbWQpIHsKKwlpZiAobmVlZF9jbWQpCiAJCWRzdF90b25lX3Bvd2VyX2NtZChzdGF0ZSk7Ci0JfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgzMiwxMyArMTEyMSwxNiBAQAogCXN3aXRjaCAodG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT0ZGOgogCQlicmVhazsKKwogCWNhc2UgU0VDX1RPTkVfT046CiAJCXZhbFs4XSB8PSAxOwogCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkc3RfdG9uZV9wb3dlcl9jbWQoc3RhdGUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxMywxMCArMTIwNSwxNiBAQAogCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkc3Rfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKKwlpZiAodmVyYm9zZSA+IDQpCisJCWRwcmludGsoIlNldCBGcmVxdWVuY3kgPSBbJWRdXG4iLCBwLT5mcmVxdWVuY3kpOworCiAJZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKIAkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CisJCWlmICh2ZXJib3NlID4gNCkKKwkJCWRwcmludGsoIlNldCBTeW1ib2xyYXRlID0gWyVkXVxuIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKKwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKIAkJZHN0X3NldF9iYW5kd2lkdGgoc3RhdGUsIHAtPnUub2ZkbS5iYW5kd2lkdGgpOwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CkBAIC05NTgsNTAgKzEyNTYsNDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkc3RfZHZic19vcHM7CiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHN0X2R2YmNfb3BzOwogCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kKiBkc3RfYXR0YWNoKGNvbnN0IHN0cnVjdCBkc3RfY29uZmlnKiBjb25maWcsCi0JCQkJc3RydWN0IGkyY19hZGFwdGVyKiBpMmMsCi0JCQkJc3RydWN0IGJ0ODc4ICpidCkKK3N0cnVjdCBkc3Rfc3RhdGUqIGRzdF9hdHRhY2goc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgZHN0X3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzdF9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOworCS8qIGNoZWNrIGlmIHRoZSBBU0lDIGlzIHRoZXJlICovCisJaWYgKGRzdF9wcm9iZShzdGF0ZSkgPCAwKSB7CisJCWlmIChzdGF0ZSkKKwkJCWtmcmVlKHN0YXRlKTsKIAotCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwotCXN0YXRlLT5jb25maWcgPSBjb25maWc7Ci0Jc3RhdGUtPmkyYyA9IGkyYzsKLQlzdGF0ZS0+YnQgPSBidDsKLQotCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCWlmIChkc3RfY2hlY2tfY2koc3RhdGUpIDwgMCkgZ290byBlcnJvcjsKLQorCQlyZXR1cm4gTlVMTDsKKwl9CiAJLyogZGV0ZXJtaW5lIHNldHRpbmdzIGJhc2VkIG9uIHR5cGUgKi8KIAlzd2l0Y2ggKHN0YXRlLT5kc3RfdHlwZSkgewogCWNhc2UgRFNUX1RZUEVfSVNfVEVSUjoKIAkJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHN0X2R2YnRfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAkJYnJlYWs7CisKIAljYXNlIERTVF9UWVBFX0lTX0NBQkxFOgogCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKKwogCWNhc2UgRFNUX1RZUEVfSVNfU0FUOgogCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZic19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKKwogCWRlZmF1bHQ6Ci0JCXByaW50aygiZHN0OiB1bmtub3duIGZyb250ZW5kIHR5cGUuIHBsZWFzZSByZXBvcnQgdG8gdGhlIExpbnV4VFYub3JnIERWQiBtYWlsaW5nbGlzdC5cbiIpOwotCQlnb3RvIGVycm9yOworCQlwcmludGsoIiVzOiB1bmtub3duIERTVCB0eXBlLiBwbGVhc2UgcmVwb3J0IHRvIHRoZSBMaW51eFRWLm9yZyBEVkIgbWFpbGluZ2xpc3QuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAoc3RhdGUpCisJCQlrZnJlZShzdGF0ZSk7CisKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwogCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwotCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCi1lcnJvcjoKLQlrZnJlZShzdGF0ZSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHN0YXRlOwkJCQkvKglNYW51IChEU1QgaXMgYSBjYXJkIG5vdCBhIGZyb250ZW5kKQkqLwogfQogCitFWFBPUlRfU1lNQk9MKGRzdF9hdHRhY2gpOworCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHN0X2R2YnRfb3BzID0gewogCiAJLmluZm8gPSB7CkBAIC0xMDUxLDYgKzEzNDYsNyBAQAogCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCiAKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSBkc3Rfc2V0X3RvbmUsCiAJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBkc3Rfc2V0X2Rpc2VxYywKIAkuc2V0X3ZvbHRhZ2UgPSBkc3Rfc2V0X3ZvbHRhZ2UsCiAJLnNldF90b25lID0gZHN0X3NldF90b25lLApAQCAtMTA4Miw4ICsxMzc4LDcgQEAKIAkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCiB9OwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRTVCBEVkItUy9UL0MgQ29tYm8gRnJvbnRlbmQgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJKYW1pZSBIb25hbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1FWFBPUlRfU1lNQk9MKGRzdF9hdHRhY2gpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1QgRFZCLVMvVC9DIENvbWJvIEZyb250ZW5kIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSmFtaWUgSG9uYW4sIE1hbnUgQWJyYWhhbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiNDE4Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gICAgRnJvbnRlbmQtZHJpdmVyIGZvciBUd2luSGFuIERTVCBGcm9udGVuZAotCi0gICAgQ29weXJpZ2h0IChDKSAyMDAzIEphbWllIEhvbmFuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0KLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0qLwotCi0jaWZuZGVmIERTVF9ICi0jZGVmaW5lIERTVF9ICi0KLSNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlICJidDg3OC5oIgotCi1zdHJ1Y3QgZHN0X2NvbmZpZwotewotCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCi0JdTggZGVtb2RfYWRkcmVzczsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBkc3RfYXR0YWNoKGNvbnN0IHN0cnVjdCBkc3RfY29uZmlnKiBjb25maWcsCi0JCQkJICAgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLAotCQkJCSAgICAgICBzdHJ1Y3QgYnQ4NzggKmJ0KTsKLQotI2VuZGlmIC8vIERTVF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODE1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwpAQCAtMCwwICsxLDg2MSBAQAorLyoKKwlDQS1kcml2ZXIgZm9yIFR3aW5IYW4gRFNUIEZyb250ZW5kL0NhcmQKKworCUNvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBNYW51IEFicmFoYW0gKG1hbnVAa3JvbXRlay5jb20pCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvZHZiL2NhLmg+CisjaW5jbHVkZSAiZHZiZGV2LmgiCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJkc3RfY2EuaCIKKyNpbmNsdWRlICJkc3RfY29tbW9uLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDE7Cittb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAxOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKKworI2RlZmluZSBkcHJpbnRrIGlmIChkZWJ1ZykgcHJpbnRrCisKKy8qCU5lZWQgc29tZSBtb3JlIHdvcmsJKi8KK3N0YXRpYyBpbnQgY2Ffc2V0X3Nsb3RfZGVzY3Iodm9pZCkKK3sKKwkvKglXZSBjb3VsZCBtYWtlIHRoaXMgbW9yZSBncmFjZWZ1bCA/CSovCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKglOZWVkIHNvbWUgbW9yZSB3b3JrCSovCitzdGF0aWMgaW50IGNhX3NldF9waWQodm9pZCkKK3sKKwkvKglXZSBjb3VsZCBtYWtlIHRoaXMgbW9yZSBncmFjZWZ1bCA/CSovCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisKK3N0YXRpYyBpbnQgcHV0X2NoZWNrc3VtKHU4ICpjaGVja19zdHJpbmcsIGludCBsZW5ndGgpCit7CisJdTggaSA9IDAsIGNoZWNrc3VtID0gMDsKKworCWlmICh2ZXJib3NlID4gMykgeworCQlkcHJpbnRrKCIlczogPT09PT09PT09PT09PT09PT09PT09PT09PSBDaGVja3N1bSBjYWxjdWxhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBTdHJpbmcgTGVuZ3RoPVsweCUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisKKwkJZHByaW50aygiJXM6IFN0cmluZz1bIiwgX19GVU5DVElPTl9fKTsKKwl9CisJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJaWYgKHZlcmJvc2UgPiAzKQorCQkJZHByaW50aygiICUwMngiLCBjaGVja19zdHJpbmdbaV0pOworCQljaGVja3N1bSArPSBjaGVja19zdHJpbmdbaV07CisJCWkrKzsKKwl9CisJaWYgKHZlcmJvc2UgPiAzKSB7CisJCWRwcmludGsoIiBdXG4iKTsKKwkJZHByaW50aygiJXM6IFN1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgY2hlY2tzdW0pOworCX0KKwljaGVja19zdHJpbmdbbGVuZ3RoXSA9IH5jaGVja3N1bSArIDE7CisJaWYgKHZlcmJvc2UgPiAzKSB7CisJCWRwcmludGsoIiVzOiBDaGVja3N1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgY2hlY2tfc3RyaW5nW2xlbmd0aF0pOworCQlkcHJpbnRrKCIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NpX2NvbW1hbmQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHU4ICogZGF0YSwgdTggKmNhX3N0cmluZywgdTggbGVuLCBpbnQgcmVhZCkKK3sKKwl1OCByZXBseTsKKworCWRzdF9jb21tX2luaXQoc3RhdGUpOworCW1zbGVlcCg2NSk7CisKKwlpZiAod3JpdGVfZHN0KHN0YXRlLCBkYXRhLCBsZW4pKSB7CisJCWRwcmludGsoIiVzOiBXcml0ZSBub3Qgc3VjY2Vzc2Z1bCwgdHJ5aW5nIHRvIHJlY292ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKGRzdF9waW9fZGlzYWJsZShzdGF0ZSkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogRFNUIFBJTyBkaXNhYmxlIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmVhZF9kc3Qoc3RhdGUsICZyZXBseSwgR0VUX0FDSykgPCAwKSB7CisJCWRwcmludGsoIiVzOiBSZWFkIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZWFkKSB7CisJCWlmICghIGRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSwgTE9OR19ERUxBWSkpIHsKKwkJCWRwcmludGsoIiVzOiA4ODIwIG5vdCByZWFkeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChyZWFkX2RzdChzdGF0ZSwgY2Ffc3RyaW5nLCAxMjgpIDwgMCkgewkvKglUcnkgdG8gbWFrZSB0aGlzIGR5bmFtaWMJKi8KKwkJCWRwcmludGsoIiVzOiBSZWFkIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRzdF9wdXRfY2koc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICpkYXRhLCBpbnQgbGVuLCB1OCAqY2Ffc3RyaW5nLCBpbnQgcmVhZCkKK3sKKwl1OCBkc3RfY2FfY29tbV9lcnIgPSAwOworCisJd2hpbGUgKGRzdF9jYV9jb21tX2VyciA8IFJFVFJJRVMpIHsKKwkJZHN0X2NvbW1faW5pdChzdGF0ZSk7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCWRwcmludGsoIiVzOiBQdXQgQ29tbWFuZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKGRzdF9jaV9jb21tYW5kKHN0YXRlLCBkYXRhLCBjYV9zdHJpbmcsIGxlbiwgcmVhZCkpIHsJLy8gSWYgZXJyb3IKKwkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CisJCQlkc3RfY2FfY29tbV9lcnIrKzsgLy8gd29yayByZXF1aXJlZCBoZXJlLgorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBjYV9nZXRfYXBwX2luZm8oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJc3RhdGljIHU4IGNvbW1hbmRbOF0gPSB7MHgwNywgMHg0MCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhmZn07CisKKwlwdXRfY2hlY2tzdW0oJmNvbW1hbmRbMF0sIGNvbW1hbmRbMF0pOworCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBzdGF0ZS0+bWVzc2FnZXMsIEdFVF9SRVBMWSkpIDwgMCkgeworCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBGQUlMRUQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAodmVyYm9zZSA+IDEpIHsKKwkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWRwcmludGsoIiVzOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDSSBNb2R1bGUgQXBwbGljYXRpb24gSW5mbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IEFwcGxpY2F0aW9uIFR5cGU9WyVkXSwgQXBwbGljYXRpb24gVmVuZG9yPVslZF0sIFZlbmRvciBDb2RlPVslZF1cbiVzOiBBcHBsaWNhdGlvbiBpbmZvPVslc11cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHN0YXRlLT5tZXNzYWdlc1s3XSwgKHN0YXRlLT5tZXNzYWdlc1s4XSA8PCA4KSB8IHN0YXRlLT5tZXNzYWdlc1s5XSwKKwkJCShzdGF0ZS0+bWVzc2FnZXNbMTBdIDw8IDgpIHwgc3RhdGUtPm1lc3NhZ2VzWzExXSwgX19GVU5DVElPTl9fLCAoY2hhciAqKSgmc3RhdGUtPm1lc3NhZ2VzWzEyXSkpOworCQlkcHJpbnRrKCIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZ2V0X3Nsb3RfY2FwcyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX2NhcHMgKnBfY2FfY2Fwcywgdm9pZCAqYXJnKQoreworCWludCBpOworCXU4IHNsb3RfY2FwWzI1Nl07CisJc3RhdGljIHU4IHNsb3RfY29tbWFuZFs4XSA9IHsweDA3LCAweDQwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweGZmfTsKKworCXB1dF9jaGVja3N1bSgmc2xvdF9jb21tYW5kWzBdLCBzbG90X2NvbW1hbmRbMF0pOworCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgc2xvdF9jb21tYW5kLCBzaXplb2YgKHNsb3RfY29tbWFuZCksIHNsb3RfY2FwLCBHRVRfUkVQTFkpKSA8IDApIHsKKwkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgRkFJTEVEICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHZlcmJvc2UgPiAxKQorCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBTVUNDRVNTICFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKglXaWxsIGltcGxlbWVudCB0aGUgcmVzdCBzb29uCQkqLworCisJaWYgKHZlcmJvc2UgPiAxKSB7CisJCWRwcmludGsoIiVzOiBTbG90IGNhcCA9IFslZF1cbiIsIF9fRlVOQ1RJT05fXywgc2xvdF9jYXBbN10pOworCQlkcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlkcHJpbnRrKCIgJWQiLCBzbG90X2NhcFtpXSk7CisJCWRwcmludGsoIlxuIik7CisJfQorCisJcF9jYV9jYXBzLT5zbG90X251bSA9IDE7CisJcF9jYV9jYXBzLT5zbG90X3R5cGUgPSAxOworCXBfY2FfY2Fwcy0+ZGVzY3JfbnVtID0gc2xvdF9jYXBbN107CisJcF9jYV9jYXBzLT5kZXNjcl90eXBlID0gMTsKKworCisJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGNhX2NhcHMgKilhcmcsIHBfY2FfY2Fwcywgc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcykpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKglOZWVkIHNvbWUgbW9yZSB3b3JrCSovCitzdGF0aWMgaW50IGNhX2dldF9zbG90X2Rlc2NyKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworc3RhdGljIGludCBjYV9nZXRfc2xvdF9pbmZvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2Ffc2xvdF9pbmZvICpwX2NhX3Nsb3RfaW5mbywgdm9pZCAqYXJnKQoreworCWludCBpOworCXN0YXRpYyB1OCBzbG90X2NvbW1hbmRbOF0gPSB7MHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZn07CisKKwl1OCAqc2xvdF9pbmZvID0gc3RhdGUtPnJ4YnVmZmVyOworCisJcHV0X2NoZWNrc3VtKCZzbG90X2NvbW1hbmRbMF0sIDcpOworCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgc2xvdF9jb21tYW5kLCBzaXplb2YgKHNsb3RfY29tbWFuZCksIHNsb3RfaW5mbywgR0VUX1JFUExZKSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiAtLT5kc3RfcHV0X2NpIEZBSUxFRCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh2ZXJib3NlID4gMSkKKwkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyoJV2lsbCBpbXBsZW1lbnQgdGhlIHJlc3Qgc29vbgkJKi8KKworCWlmICh2ZXJib3NlID4gMSkgeworCQlkcHJpbnRrKCIlczogU2xvdCBpbmZvID0gWyVkXVxuIiwgX19GVU5DVElPTl9fLCBzbG90X2luZm9bM10pOworCQlkcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlkcHJpbnRrKCIgJWQiLCBzbG90X2luZm9baV0pOworCQlkcHJpbnRrKCJcbiIpOworCX0KKworCWlmIChzbG90X2luZm9bNF0gJiAweDgwKSB7CisJCXBfY2Ffc2xvdF9pbmZvLT5mbGFncyA9IENBX0NJX01PRFVMRV9QUkVTRU5UOworCQlwX2NhX3Nsb3RfaW5mby0+bnVtID0gMTsKKwkJcF9jYV9zbG90X2luZm8tPnR5cGUgPSBDQV9DSTsKKwl9CisJZWxzZSBpZiAoc2xvdF9pbmZvWzRdICYgMHg0MCkgeworCQlwX2NhX3Nsb3RfaW5mby0+ZmxhZ3MgPSBDQV9DSV9NT0RVTEVfUkVBRFk7CisJCXBfY2Ffc2xvdF9pbmZvLT5udW0gPSAxOworCQlwX2NhX3Nsb3RfaW5mby0+dHlwZSA9IENBX0NJOworCX0KKwllbHNlIHsKKwkJcF9jYV9zbG90X2luZm8tPmZsYWdzID0gMDsKKwl9CisKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopYXJnLCBwX2NhX3Nsb3RfaW5mbywgc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisKK3N0YXRpYyBpbnQgY2FfZ2V0X21lc3NhZ2Uoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgdm9pZCAqYXJnKQoreworCXU4IGkgPSAwOworCXUzMiBjb21tYW5kID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwX2NhX21lc3NhZ2UsICh2b2lkICopYXJnLCBzaXplb2YgKHN0cnVjdCBjYV9tc2cpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKworCWlmIChwX2NhX21lc3NhZ2UtPm1zZykgeworCQlpZiAodmVyYm9zZSA+IDMpCisJCQlkcHJpbnRrKCJNZXNzYWdlID0gWyUwMnggJTAyeCAlMDJ4XVxuIiwgcF9jYV9tZXNzYWdlLT5tc2dbMF0sIHBfY2FfbWVzc2FnZS0+bXNnWzFdLCBwX2NhX21lc3NhZ2UtPm1zZ1syXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJY29tbWFuZCA9IGNvbW1hbmQgfCBwX2NhX21lc3NhZ2UtPm1zZ1tpXTsKKwkJCWlmIChpIDwgMikKKwkJCQljb21tYW5kID0gY29tbWFuZCA8PCA4OworCQl9CisJCWlmICh2ZXJib3NlID4gMykKKwkJCWRwcmludGsoIiVzOkNvbW1hbmQ9WzB4JXhdXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworCisJCXN3aXRjaCAoY29tbWFuZCkgeworCQkJY2FzZSBDQV9BUFBfSU5GTzoKKwkJCQltZW1jcHkocF9jYV9tZXNzYWdlLT5tc2csIHN0YXRlLT5tZXNzYWdlcywgMTI4KTsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBwX2NhX21lc3NhZ2UsIHNpemVvZiAoc3RydWN0IGNhX21zZykpICkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9lbjUwMjIxX3RhZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIpCit7CisJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX1NFU1NJT04pIHsKKwkJaHdfYnVmZmVyLT5tc2dbMl0gPSBwX2NhX21lc3NhZ2UtPm1zZ1sxXTsJCS8qCQlNU0IJCQkqLworCQlod19idWZmZXItPm1zZ1szXSA9IHBfY2FfbWVzc2FnZS0+bXNnWzJdOwkJLyoJCUxTQgkJCSovCisJfQorCWVsc2UgeworCQlod19idWZmZXItPm1zZ1syXSA9IDB4MDM7CisJCWh3X2J1ZmZlci0+bXNnWzNdID0gMHgwMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfODgyMF9idWZmZXIoc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyKQoreworCXVuc2lnbmVkIGludCBpOworCisJZHByaW50aygiJXM6RGVidWc9WyIsIF9fRlVOQ1RJT05fXyk7CisJZm9yIChpID0gMDsgaSA8IChod19idWZmZXItPm1zZ1swXSArIDEpOyBpKyspCisJCWRwcmludGsoIiAlMDJ4IiwgaHdfYnVmZmVyLT5tc2dbaV0pOworCWRwcmludGsoIl1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSkKK3sKKwlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCAoaHdfYnVmZmVyLT5sZW5ndGggKyAxKSwgaHdfYnVmZmVyLT5tc2csIHJlcGx5KSkgPCAwKSB7CisJCWRwcmludGsoIiVzOiBEU1QtQ0kgQ29tbWFuZCBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogUmVzZXR0aW5nIERTVC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJkY19yZXNldF9zdGF0ZShzdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHZlcmJvc2UgPiAyKQorCQlkcHJpbnRrKCIlczogRFNULUNJIENvbW1hbmQgc3VjY2VzLlxuIiwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2Ffc2V0X3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5LCB1OCBxdWVyeSkKK3sKKwl1MzIgaHdfb2Zmc2V0LCBidWZfb2Zmc2V0LCBpLCBrOworCXUzMiBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMCwgZXNfaW5mb19sZW5ndGggPSAwLCBsZW5ndGggPSAwLCB3b3JkcyA9IDA7CisJdTggZm91bmRfcHJvZ19jYV9kZXNjID0gMCwgZm91bmRfc3RyZWFtX2NhX2Rlc2MgPSAwLCBlcnJvcl9jb25kaXRpb24gPSAwLCBod19idWZmZXJfbGVuZ3RoID0gMDsKKworCWlmICh2ZXJib3NlID4gMykKKwkJZHByaW50aygiJXMsIHBfY2FfbWVzc2FnZSBsZW5ndGggJWQgKDB4JXgpXG4iLCBfX0ZVTkNUSU9OX18scF9jYV9tZXNzYWdlLT5sZW5ndGgscF9jYV9tZXNzYWdlLT5sZW5ndGggKTsKKworCWhhbmRsZV9lbjUwMjIxX3RhZyhzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIpOwkJCS8qCUVONTAyMjEgdGFnCQkqLworCisJLyoJSGFuZGxlIHRoZSBsZW5ndGggZmllbGQgKHZhcmlhYmxlKQkqLworCWlmICghKHBfY2FfbWVzc2FnZS0+bXNnWzNdICYgMHg4MCkpIHsJCQkJLyoJTGVuZ3RoID0gMQkJKi8KKwkJbGVuZ3RoID0gcF9jYV9tZXNzYWdlLT5tc2dbM10gJiAweDdmOworCQl3b3JkcyA9IDA7CQkJCQkJLyoJZG9taSdzIHN1Z2dlc3Rpb24JKi8KKwl9CisJZWxzZSB7CQkJCQkJCQkvKglMZW5ndGggPSB3b3JkcwkJKi8KKwkJd29yZHMgPSBwX2NhX21lc3NhZ2UtPm1zZ1szXSAmIDB4N2Y7CisJCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisJCQlsZW5ndGggPSBsZW5ndGggPDwgODsKKwkJCWxlbmd0aCA9IGxlbmd0aCB8IHBfY2FfbWVzc2FnZS0+bXNnWzQgKyBpXTsKKwkJfQorCX0KKwlpZiAodmVyYm9zZSA+IDQpIHsKKwkJZHByaW50aygiJXM6TGVuZ3RoPVslZCAoMHgleCldLCBXb3Jkcz1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCxsZW5ndGgsIHdvcmRzKTsKKworCQkvKglEZWJ1ZyBJbnB1dCBzdHJpbmcJCSovCisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbaV0pOworCQlkcHJpbnRrKCJdXG4iKTsKKwl9CisKKwlod19vZmZzZXQgPSA3OworCWJ1Zl9vZmZzZXQgPSB3b3JkcyArIDQ7CisKKwkvKgkJUHJvZ3JhbSBIZWFkZXIJCQkqLworCWlmICh2ZXJib3NlID4gNCkKKwkJZHByaW50aygiXG4lczpQcm9ncmFtIEhlYWRlcj1bIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwkJaWYgKHZlcmJvc2UgPiA0KQorCQkJZHByaW50aygiICUwMngiLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7CisJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKzsKKwl9CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCJdXG4iKTsKKworCXByb2dyYW1faW5mb19sZW5ndGggPSAwOworCXByb2dyYW1faW5mb19sZW5ndGggPSAoKChwcm9ncmFtX2luZm9fbGVuZ3RoIHwgcF9jYV9tZXNzYWdlLT5tc2dbd29yZHMgKyA4XSkgJiAweDBmKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW3dvcmRzICsgOV07CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCIlczpQcm9ncmFtIGluZm8gTGVuZ3RoPVslZF1bJTAyeF0sIGh3X29mZnNldD1bJWRdLCBidWZfb2Zmc2V0PVslZF0gXG4iLAorCQkJX19GVU5DVElPTl9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQpOworCisJaWYgKHByb2dyYW1faW5mb19sZW5ndGggJiYgKHByb2dyYW1faW5mb19sZW5ndGggPCAyNTYpKSB7CS8qCUlmIHByb2dyYW1faW5mb19sZW5ndGgJCSovCisJCWh3X2J1ZmZlci0+bXNnWzExXSA9IGh3X2J1ZmZlci0+bXNnWzExXSAmIDB4MGY7CQkvKglyZXEgb25seSA0IGJpdHMJCQkqLworCQlod19idWZmZXItPm1zZ1sxMl0gPSBod19idWZmZXItPm1zZ1sxMl0gKyAxOwkJLyoJaW5jcmVtZW50ISBBU0lDIGJ1ZyEJCSovCisKKwkJaWYgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAxXSA9PSAweDA5KSB7CS8qCUNoZWNrIENBIGRlc2NyaXB0b3IJCSovCisJCQlmb3VuZF9wcm9nX2NhX2Rlc2MgPSAxOworCQkJaWYgKHZlcmJvc2UgPiA0KQorCQkJCWRwcmludGsoIiVzOiBGb3VuZCBDQSBkZXNjcmlwdG9yIEAgUHJvZ3JhbSBsZXZlbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCisJCWlmIChmb3VuZF9wcm9nX2NhX2Rlc2MpIHsJCQkJLyoJQ29tbWFuZCBvbmx5IGlmIENBIGRlc2NyaXB0b3IJKi8KKwkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOwkvKglDQSBQTVQgY29tbWFuZCBJRAkqLworCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrOworCQl9CisKKwkJLyoJCQlQcm9ncmFtIGRlc2NyaXB0b3JzCQkJCSovCisJCWlmICh2ZXJib3NlID4gNCkgeworCQkJZHByaW50aygiJXM6KioqKioqKioqKj5idWZfb2Zmc2V0PVslZF0sIGh3X29mZnNldD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7CisJCQlkcHJpbnRrKCIlczpQcm9ncmFtIGRlc2NyaXB0b3JzPVsiLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCXdoaWxlIChwcm9ncmFtX2luZm9fbGVuZ3RoICYmICFlcnJvcl9jb25kaXRpb24pIHsJCS8qCUNvcHkgcHJvZyBkZXNjcmlwdG9ycwkqLworCQkJaWYgKHByb2dyYW1faW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgewkvKglFcnJvciBzaXR1YXRpb24JCSovCisJCQkJZHByaW50ayAoIiVzOlwiV0FSTklOR1wiIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBwcm9nX2luZm9fbGVuZ3RoPVslZF1cbiIsCisJCQkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIHByb2dyYW1faW5mb19sZW5ndGgpOworCQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEJhaWxpbmcgb3V0IG9mIHBvc3NpYmxlIGxvb3BcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZXJyb3JfY29uZGl0aW9uID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0XSA9IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOworCQkJZHByaW50aygiICUwMngiLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7CisJCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIHByb2dyYW1faW5mb19sZW5ndGgtLTsKKwkJfQorCQlpZiAodmVyYm9zZSA+IDQpIHsKKwkJCWRwcmludGsoIl1cbiIpOworCQkJZHByaW50aygiJXM6KioqKioqKioqKj5idWZfb2Zmc2V0PVslZF0sIGh3X29mZnNldD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7CisJCX0KKwkJaWYgKGZvdW5kX3Byb2dfY2FfZGVzYykgeworCQkJaWYgKCFyZXBseSkgeworCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDE7CQkvKglPSyBkZXNjcmFtYmxpbmcJCQkqLworCQkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBPSyBEZXNjcmFtYmxpbmdcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaHdfYnVmZmVyLT5tc2dbMTNdID0gMHgwMjsJCS8qCU9rIE1NSQkJCQkqLworCQkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBPayBNTUlcbiIpOworCQkJfQorCQkJaWYgKHF1ZXJ5KSB7CisJCQkJaHdfYnVmZmVyLT5tc2dbMTNdID0gMHgwMzsJCS8qCVF1ZXJ5CQkJCSovCisJCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCQlkcHJpbnRrKCJDQSBQTVQgQ29tbWFuZCA9IENBIFBNVCBxdWVyeVxuIik7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCWh3X2J1ZmZlci0+bXNnWzExXSA9IGh3X2J1ZmZlci0+bXNnWzExXSAmIDB4ZjA7CQkvKglEb24ndCB3cml0ZSB0byBBU0lDCQkqLworCQlod19idWZmZXItPm1zZ1sxMl0gPSBod19idWZmZXItPm1zZ1sxMl0gPSAweDAwOworCX0KKwlpZiAodmVyYm9zZSA+IDQpCisJCWRwcmludGsoIiVzOioqKioqKioqKio+cF9jYV9tZXNzYWdlLT5sZW5ndGg9WyVkXSwgYnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBwX2NhX21lc3NhZ2UtPmxlbmd0aCwgYnVmX29mZnNldCwgaHdfb2Zmc2V0KTsKKworCXdoaWxlICgoYnVmX29mZnNldCAgPCBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgICYmICFlcnJvcl9jb25kaXRpb24pIHsKKwkJLyoJQmFpbCBvdXQgaW4gY2FzZSBvZiBhbiBpbmRlZmluaXRlIGxvb3AJCSovCisJCWlmICgoZXNfaW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgfHwgKGJ1Zl9vZmZzZXQgPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkpIHsKKwkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBwcm9nX2luZm9fbGVuZ3RoPVslZF0sIGJ1Zl9vZmZzZXQ9WyVkXVxuIiwKKwkJCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBidWZfb2Zmc2V0KTsKKworCQkJZHByaW50aygiJXM6XCJXQVJOSU5HXCIgQmFpbGluZyBvdXQgb2YgcG9zc2libGUgbG9vcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycm9yX2NvbmRpdGlvbiA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCQlTdHJlYW0gSGVhZGVyCQkJCSovCisKKwkJZm9yIChrID0gMDsgayA8IDU7IGsrKykgeworCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsga10gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsga107CisJCX0KKworCQllc19pbmZvX2xlbmd0aCA9IDA7CisJCWVzX2luZm9fbGVuZ3RoID0gKGVzX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAzXSAmIDB4MGYpKSA8PCA4IHwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdOworCisJCWlmICh2ZXJib3NlID4gNCkgeworCQkJZHByaW50aygiXG4lczotLS0tLT5TdHJlYW0gaGVhZGVyPVslMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDBdLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0sCisJCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDJdLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10sCisJCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdKTsKKworCQkJZHByaW50aygiJXM6LS0tLS0+U3RyZWFtIHR5cGU9WyUwMnhdLCBlcyBsZW5ndGg9WyVkICgweCV4KV0sIENoYXJzPVslMDJ4XSBbJTAyeF0sIGJ1Zl9vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLAorCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAwXSwgZXNfaW5mb19sZW5ndGgsIGVzX2luZm9fbGVuZ3RoLAorCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAzXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdLCBidWZfb2Zmc2V0KTsKKwkJfQorCisJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCArIDNdICY9IDB4MGY7CQkJLyoJcmVxIG9ubHkgNCBiaXRzCQkJKi8KKworCQlpZiAoZm91bmRfcHJvZ19jYV9kZXNjKSB7CisJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyAzXSA9IDB4MDA7CisJCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyA0XSA9IDB4MDA7CisJCX0KKworCQlod19vZmZzZXQgKz0gNSwgYnVmX29mZnNldCArPSA1LCBod19idWZmZXJfbGVuZ3RoICs9IDU7CisKKwkJLyoJCUNoZWNrIGZvciBDQSBkZXNjcmlwdG9yCQkJKi8KKwkJaWYgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAxXSA9PSAweDA5KSB7CisJCQlpZiAodmVyYm9zZSA+IDQpCisJCQkJZHByaW50aygiJXM6Rm91bmQgQ0EgZGVzY3JpcHRvciBAIFN0cmVhbSBsZXZlbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWZvdW5kX3N0cmVhbV9jYV9kZXNjID0gMTsKKwkJfQorCisJCS8qCQlFUyBkZXNjcmlwdG9ycwkJCQkqLworCisJCWlmIChlc19pbmZvX2xlbmd0aCAmJiAhZXJyb3JfY29uZGl0aW9uICYmICFmb3VuZF9wcm9nX2NhX2Rlc2MgJiYgZm91bmRfc3RyZWFtX2NhX2Rlc2MpIHsKKy8vCQkJaWYgKCFjYV9wbXRfZG9uZSkgeworCQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsJLyoJQ0EgUE1UIGNtZChlcykJKi8KKwkJCQlpZiAodmVyYm9zZSA+IDQpCisJCQkJCXByaW50aygiJXM6LS0tLS0+Q0EgUE1UIENvbW1hbmQgSUQ9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdKTsKKy8vCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLSwgY2FfcG10X2RvbmUgPSAxOworCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLTsKKy8vCQkJfQorCQkJaWYgKHZlcmJvc2UgPiA0KQorCQkJCWRwcmludGsoIiVzOi0tLS0tPkVTIGRlc2NyaXB0b3JzPVsiLCBfX0ZVTkNUSU9OX18pOworCisJCQl3aGlsZSAoZXNfaW5mb19sZW5ndGggJiYgIWVycm9yX2NvbmRpdGlvbikgewkvKglFUyBkZXNjcmlwdG9ycwkJCSovCisJCQkJaWYgKChlc19pbmZvX2xlbmd0aCA+IHBfY2FfbWVzc2FnZS0+bGVuZ3RoKSB8fCAoYnVmX29mZnNldCA+IHBfY2FfbWVzc2FnZS0+bGVuZ3RoKSkgeworCQkJCQlpZiAodmVyYm9zZSA+IDQpIHsKKwkJCQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEVTIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBlc19pbmZvX2xlbmd0aD1bJWRdLCBidWZfb2Zmc2V0PVslZF1cbiIsCisJCQkJCQkJCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXNfaW5mb19sZW5ndGgsIGJ1Zl9vZmZzZXQpOworCisJCQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBCYWlsaW5nIG91dCBvZiBwb3NzaWJsZSBsb29wXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQl9CisJCQkJCWVycm9yX2NvbmRpdGlvbiA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKKwkJCQlpZiAodmVyYm9zZSA+IDMpCisJCQkJCWRwcmludGsoIiUwMnggIiwgaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0XSk7CisJCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrLCBlc19pbmZvX2xlbmd0aC0tOworCQkJfQorCQkJZm91bmRfc3RyZWFtX2NhX2Rlc2MgPSAwOwkJCS8qCXVuc2V0IGZvciBuZXcgc3RyZWFtcwkJKi8KKwkJCWRwcmludGsoIl1cbiIpOworCQl9CisJfQorCisJLyoJCU1DVSBNYWdpYyB3b3JkcwkJCQkJKi8KKworCWh3X2J1ZmZlcl9sZW5ndGggKz0gNzsKKwlod19idWZmZXItPm1zZ1swXSA9IGh3X2J1ZmZlcl9sZW5ndGg7CisJaHdfYnVmZmVyLT5tc2dbMV0gPSA2NDsKKwlod19idWZmZXItPm1zZ1s0XSA9IDM7CisJaHdfYnVmZmVyLT5tc2dbNV0gPSBod19idWZmZXItPm1zZ1swXSAtIDc7CisJaHdfYnVmZmVyLT5tc2dbNl0gPSAwOworCisKKwkvKiAgICAgIEZpeCBsZW5ndGggICAgICAqLworCWh3X2J1ZmZlci0+bGVuZ3RoID0gaHdfYnVmZmVyLT5tc2dbMF07CisKKwlwdXRfY2hlY2tzdW0oJmh3X2J1ZmZlci0+bXNnWzBdLCBod19idWZmZXItPm1zZ1swXSk7CisJLyogICAgICBEbyB0aGUgYWN0dWFsIHdyaXRlICAgICAqLworCWlmICh2ZXJib3NlID4gNCkgeworCQlkcHJpbnRrKCIlczo9PT09PT09PT09PT09PT09PT09PT09REVCVUdHSU5HPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBBY3R1YWwgTGVuZ3RoPVslZF1cbiIsIF9fRlVOQ1RJT05fXywgaHdfYnVmZmVyX2xlbmd0aCk7CisJfQorCS8qICAgICAgT25seSBmb3IgZGVidWdnaW5nISAgICAgKi8KKwlpZiAodmVyYm9zZSA+IDIpCisJCWRlYnVnXzg4MjBfYnVmZmVyKGh3X2J1ZmZlcik7CisJaWYgKHZlcmJvc2UgPiAzKQorCQlkcHJpbnRrKCIlczogUmVwbHkgPSBbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKKwl3cml0ZV90b184ODIwKHN0YXRlLCBod19idWZmZXIsIHJlcGx5KTsKKworCXJldHVybiAwOworfQorCisvKglCb2FyZCBzdXBwb3J0cyBDQSBQTVQgcmVwbHkgPwkJKi8KK3N0YXRpYyBpbnQgZHN0X2NoZWNrX2NhX3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIpCit7CisJaW50IGNhX3BtdF9yZXBseV90ZXN0ID0gMDsKKworCS8qCURvIHRlc3QgYm9hcmQJCQkqLworCS8qCU5vdCB0aGVyZSB5ZXQgYnV0IHNvb24JCSovCisKKworCS8qCUNBIFBNVCBSZXBseSBjYXBhYmxlCQkqLworCWlmIChjYV9wbXRfcmVwbHlfdGVzdCkgeworCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAxLCBHRVRfUkVQTFkpKSA8IDApIHsKKwkJCWRwcmludGsoIiVzOiBjYV9zZXRfcG10Li4gZmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCS8qCVByb2Nlc3MgQ0EgUE1UIFJlcGx5CQkqLworCS8qCXdpbGwgaW1wbGVtZW50IHNvb24JCSovCisJCWRwcmludGsoIiVzOiBOb3QgdGhlcmUgeWV0XG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwkvKglDQSBQTVQgUmVwbHkgbm90IGNhcGFibGUJKi8KKwlpZiAoIWNhX3BtdF9yZXBseV90ZXN0KSB7CisJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIE5PX1JFUExZKSkgPCAwKSB7CisJCQlkcHJpbnRrKCIlczogY2Ffc2V0X3BtdC4uIGZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICh2ZXJib3NlID4gMykKKwkJCWRwcmludGsoIiVzOiBjYV9zZXRfcG10Li4gc3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qCXB1dCBhIGR1bW15IG1lc3NhZ2UJCSovCisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ffc2VuZF9tZXNzYWdlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHZvaWQgKmFyZykKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IGNhX21lc3NhZ2VfaGVhZGVyX2xlbjsKKworCXUzMiBjb21tYW5kID0gMDsKKwlzdHJ1Y3QgY2FfbXNnICpod19idWZmZXI7CisKKwlpZiAoKGh3X2J1ZmZlciA9IChzdHJ1Y3QgY2FfbXNnICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICh2ZXJib3NlID4gMykKKwkJZHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIocF9jYV9tZXNzYWdlLCAodm9pZCAqKWFyZywgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHBfY2FfbWVzc2FnZS0+bXNnKSB7CisJCWNhX21lc3NhZ2VfaGVhZGVyX2xlbiA9IHBfY2FfbWVzc2FnZS0+bGVuZ3RoOwkvKglSZXN0b3JlIGl0IGJhY2sgd2hlbiB5b3UgYXJlIGRvbmUJKi8KKwkJLyoJRU41MDIyMSB0YWcJKi8KKwkJY29tbWFuZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJY29tbWFuZCA9IGNvbW1hbmQgfCBwX2NhX21lc3NhZ2UtPm1zZ1tpXTsKKwkJCWlmIChpIDwgMikKKwkJCQljb21tYW5kID0gY29tbWFuZCA8PCA4OworCQl9CisJCWlmICh2ZXJib3NlID4gMykKKwkJCWRwcmludGsoIiVzOkNvbW1hbmQ9WzB4JXhdXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworCisJCXN3aXRjaCAoY29tbWFuZCkgeworCQkJY2FzZSBDQV9QTVQ6CisJCQkJaWYgKHZlcmJvc2UgPiAzKQorCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gU0VORF9DQV9QTVRcbiIpOworCQkJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApKSA8IDApIHsKKwkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVCBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAodmVyYm9zZSA+IDMpCisJCQkJCWRwcmludGsoIiVzOiAtLT5DQV9QTVQgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworLy8JCQkJcmV0dmFsID0gZHVtbXlfc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ0FfUE1UX1JFUExZOgorCQkJCWlmICh2ZXJib3NlID4gMykKKwkJCQkJZHByaW50aygiQ29tbWFuZCA9IENBX1BNVF9SRVBMWVxuIik7CisJCQkJLyogICAgICBIYXZlIHRvIGhhbmRsZSB0aGUgMiBiYXNpYyB0eXBlcyBvZiBjYXJkcyBoZXJlICAqLworCQkJCWlmICgoZHN0X2NoZWNrX2NhX3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIpKSA8IDApIHsKKwkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVF9SRVBMWSBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAodmVyYm9zZSA+IDMpCisJCQkJCWRwcmludGsoIiVzOiAtLT5DQV9QTVRfUkVQTFkgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQkJLyogICAgICBDZXJ0YWluIGJvYXJkcyBkbyBiZWhhdmUgZGlmZmVyZW50ID8gICAgICAgICAgICAqLworLy8JCQkJcmV0dmFsID0gY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDEsIDEpOworCisJCQljYXNlIENBX0FQUF9JTkZPX0VOUVVJUlk6CQkvLyBvbmx5IGZvciBkZWJ1Z2dpbmcKKwkJCQlpZiAodmVyYm9zZSA+IDMpCisJCQkJCWRwcmludGsoIiVzOiBHZXR0aW5nIENhbSBBcHBsaWNhdGlvbiBpbmZvcm1hdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJCWlmICgoY2FfZ2V0X2FwcF9pbmZvKHN0YXRlKSkgPCAwKSB7CisJCQkJCWRwcmludGsoIiVzOiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmICh2ZXJib3NlID4gMykKKwkJCQkJcHJpbnRrKCIlczogLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3RfY2FfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSogZHZiZGV2ID0gKHN0cnVjdCBkdmJfZGV2aWNlKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkc3Rfc3RhdGUqKSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGNhX3Nsb3RfaW5mbyAqcF9jYV9zbG90X2luZm87CisJc3RydWN0IGNhX2NhcHMgKnBfY2FfY2FwczsKKwlzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2U7CisKKwlpZiAoKHBfY2FfbWVzc2FnZSA9IChzdHJ1Y3QgY2FfbXNnICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKChwX2NhX3Nsb3RfaW5mbyA9IChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKChwX2NhX2NhcHMgPSAoc3RydWN0IGNhX2NhcHMgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9jYXBzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoJV2UgaGF2ZSBub3cgb25seSB0aGUgc3RhbmRhcmQgaW9jdGwncywgdGhlIGRyaXZlciBpcyB1cHBvc2VkIHRvIGhhbmRsZSBpbnRlcm5hbHMuCSovCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBDQV9TRU5EX01TRzoKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogU2VuZGluZyBtZXNzYWdlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKChjYV9zZW5kX21lc3NhZ2Uoc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7CisJCQkJZHByaW50aygiJXM6IC0tPkNBX1NFTkRfTVNHIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQV9HRVRfTVNHOgorCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWRwcmludGsoIiVzOiBHZXR0aW5nIG1lc3NhZ2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoKGNhX2dldF9tZXNzYWdlKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgeworCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfTVNHIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX01TRyBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ0FfUkVTRVQ6CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJZHByaW50aygiJXM6IFJlc2V0dGluZyBEU1RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7CisJCQltc2xlZXAoNDAwMCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ0FfR0VUX1NMT1RfSU5GTzoKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBTbG90IGluZm9cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoKGNhX2dldF9zbG90X2luZm8oc3RhdGUsIHBfY2Ffc2xvdF9pbmZvLCBhcmcpKSA8IDApIHsKKwkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX1NMT1RfSU5GTyBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9TTE9UX0lORk8gU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQlicmVhazsKKworCQljYXNlIENBX0dFVF9DQVA6CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJZHByaW50aygiJXM6IEdldHRpbmcgU2xvdCBjYXBhYmlsaXRpZXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoKGNhX2dldF9zbG90X2NhcHMoc3RhdGUsIHBfY2FfY2FwcywgYXJnKSkgPCAwKSB7CisJCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9DQVAgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfQ0FQIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQV9HRVRfREVTQ1JfSU5GTzoKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBkZXNjcmFtYmxlciBkZXNjcmlwdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmICgoY2FfZ2V0X3Nsb3RfZGVzY3Ioc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7CisJCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9ERVNDUl9JTkZPIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX0RFU0NSX0lORk8gU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQlicmVhazsKKworCQljYXNlIENBX1NFVF9ERVNDUjoKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogU2V0dGluZyBkZXNjcmFtYmxlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmICgoY2Ffc2V0X3Nsb3RfZGVzY3IoKSkgPCAwKSB7CisJCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9ERVNDUiBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9ERVNDUiBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ0FfU0VUX1BJRDoKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlkcHJpbnRrKCIlczogU2V0dGluZyBQSURcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoKGNhX3NldF9waWQoKSkgPCAwKSB7CisJCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9QSUQgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRVRfUElEIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCIlczpEZXZpY2Ugb3BlbmVkIFslcF1cbiIsIF9fRlVOQ1RJT05fXywgZmlsZSk7CisJdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCIlczpEZXZpY2UgY2xvc2VkLlxuIiwgX19GVU5DVElPTl9fKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzdF9jYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICogb2Zmc2V0KQoreworCWludCBieXRlc19yZWFkID0gMDsKKworCWlmICh2ZXJib3NlID4gNCkKKwkJZHByaW50aygiJXM6RGV2aWNlIHJlYWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICogb2Zmc2V0KQoreworCWlmICh2ZXJib3NlID4gNCkKKwkJZHByaW50aygiJXM6RGV2aWNlIHdyaXRlLlxuIiwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc3RfY2FfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSAodm9pZCAqKWRzdF9jYV9pb2N0bCwKKwkub3BlbiA9IGRzdF9jYV9vcGVuLAorCS5yZWxlYXNlID0gZHN0X2NhX3JlbGVhc2UsCisJLnJlYWQgPSBkc3RfY2FfcmVhZCwKKwkud3JpdGUgPSBkc3RfY2Ffd3JpdGUKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2RldmljZSBkdmJkZXZfY2EgPSB7CisJLnByaXYgPSBOVUxMLAorCS51c2VycyA9IDEsCisJLnJlYWRlcnMgPSAxLAorCS53cml0ZXJzID0gMSwKKwkuZm9wcyA9ICZkc3RfY2FfZm9wcworfTsKKworaW50IGRzdF9jYV9hdHRhY2goc3RydWN0IGRzdF9zdGF0ZSAqZHN0LCBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7CisJaWYgKHZlcmJvc2UgPiA0KQorCQlkcHJpbnRrKCIlczpyZWdpc3RlcmluZyBEU1QtQ0EgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoZHZiX2FkYXB0ZXIsICZkdmJkZXYsICZkdmJkZXZfY2EsIGRzdCwgRFZCX0RFVklDRV9DQSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZHN0X2NhX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFNUIERWQi1TL1QvQyBDb21ibyBDQSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hbnUgQWJyYWhhbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNkMGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKwlDQS1kcml2ZXIgZm9yIFR3aW5IYW4gRFNUIEZyb250ZW5kL0NhcmQKKworCUNvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBNYW51IEFicmFoYW0gKG1hbnVAa3JvbXRlay5jb20pCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX0RTVF9DQV9IXworI2RlZmluZSBfRFNUX0NBX0hfCisKKyNkZWZpbmUgUkVUUklFUwkJCTUKKworCisjZGVmaW5lCUNBX0FQUF9JTkZPX0VOUVVJUlkJMHg5ZjgwMjAKKyNkZWZpbmUJQ0FfQVBQX0lORk8JCTB4OWY4MDIxCisjZGVmaW5lCUNBX0VOVEVSX01FTlUJCTB4OWY4MDIyCisjZGVmaW5lIENBX0lORk9fRU5RVUlSWQkJMHg5ZjgwMzAKKyNkZWZpbmUJQ0FfSU5GTwkJCTB4OWY4MDMxCisjZGVmaW5lIENBX1BNVAkJCTB4OWY4MDMyCisjZGVmaW5lIENBX1BNVF9SRVBMWQkJMHg5ZjgwMzMKKworI2RlZmluZSBDQV9DTE9TRV9NTUkJCTB4OWY4ODAwCisjZGVmaW5lIENBX0RJU1BMQVlfQ09OVFJPTAkweDlmODgwMQorI2RlZmluZSBDQV9ESVNQTEFZX1JFUExZCTB4OWY4ODAyCisjZGVmaW5lIENBX1RFWFRfTEFTVAkJMHg5Zjg4MDMKKyNkZWZpbmUgQ0FfVEVYVF9NT1JFCQkweDlmODgwNAorI2RlZmluZSBDQV9LRVlQQURfQ09OVFJPTAkweDlmODgwNQorI2RlZmluZSBDQV9LRVlQUkVTUwkJMHg5Zjg4MDYKKworI2RlZmluZSBDQV9FTlFVSVJZCQkweDlmODgwNworI2RlZmluZSBDQV9BTlNXRVIJCTB4OWY4ODA4CisjZGVmaW5lIENBX01FTlVfTEFTVAkJMHg5Zjg4MDkKKyNkZWZpbmUgQ0FfTUVOVV9NT1JFCQkweDlmODgwYQorI2RlZmluZSBDQV9NRU5VX0FOU1dFUgkJMHg5Zjg4MGIKKyNkZWZpbmUgQ0FfTElTVF9MQVNUCQkweDlmODgwYworI2RlZmluZSBDQV9MSVNUX01PUkUJCTB4OWY4ODBkCisKKworc3RydWN0IGRzdF9jYV9wcml2YXRlIHsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpkc3Q7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzZGEyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKwlGcm9udGVuZC1kcml2ZXIgZm9yIFR3aW5IYW4gRFNUIEZyb250ZW5kCisKKwlDb3B5cmlnaHQgKEMpIDIwMDMgSmFtaWUgSG9uYW4KKwlDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgTWFudSBBYnJhaGFtIChtYW51QGtyb210ZWsuY29tKQorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIERTVF9DT01NT05fSAorI2RlZmluZSBEU1RfQ09NTU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImJ0ODc4LmgiCisKKyNpbmNsdWRlICJkc3RfY2EuaCIKKworCisjZGVmaW5lIE5PX0RFTEFZCQkwCisjZGVmaW5lIExPTkdfREVMQVkJCTEKKyNkZWZpbmUgREVWSUNFX0lOSVQJCTIKKworI2RlZmluZSBERUxBWQkJCTEKKworI2RlZmluZSBEU1RfVFlQRV9JU19TQVQJCTAKKyNkZWZpbmUgRFNUX1RZUEVfSVNfVEVSUgkxCisjZGVmaW5lIERTVF9UWVBFX0lTX0NBQkxFCTIKKyNkZWZpbmUgRFNUX1RZUEVfSVNfQVRTQwkzCisKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX05FV1RVTkUJMQorI2RlZmluZSBEU1RfVFlQRV9IQVNfVFMyMDQJMgorI2RlZmluZSBEU1RfVFlQRV9IQVNfU1lNRElWCTQKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX0ZXXzEJOAorI2RlZmluZSBEU1RfVFlQRV9IQVNfRldfMgkxNgorI2RlZmluZSBEU1RfVFlQRV9IQVNfRldfMwkzMgorI2RlZmluZSBEU1RfVFlQRV9IQVNfRldfQlVJTEQJNjQKKworLyoJQ2FyZCBjYXBhYmlsaXR5IGxpc3QJKi8KKworI2RlZmluZSBEU1RfVFlQRV9IQVNfTUFDCTEKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX0RJU0VRQzMJMgorI2RlZmluZSBEU1RfVFlQRV9IQVNfRElTRVFDNAk0CisjZGVmaW5lIERTVF9UWVBFX0hBU19ESVNFUUM1CTgKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX01PVE8JMTYKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX0NBCQkzMgorI2RlZmluZQlEU1RfVFlQRV9IQVNfQU5BTE9HCTY0CS8qCUFuYWxvZyBpbnB1dHMJKi8KKyNkZWZpbmUgRFNUX1RZUEVfSEFTX1NFU1NJT04JMTI4CisKKworI2RlZmluZSBSRENfODgyMF9QSU9fMF9ESVNBQkxFCTAKKyNkZWZpbmUgUkRDXzg4MjBfUElPXzBfRU5BQkxFCTEKKyNkZWZpbmUgUkRDXzg4MjBfSU5UCQkyCisjZGVmaW5lIFJEQ184ODIwX1JFU0VUCQk0CisKKy8qCURTVCBDb21tdW5pY2F0aW9uCSovCisjZGVmaW5lIEdFVF9SRVBMWQkJMQorI2RlZmluZSBOT19SRVBMWQkJMAorCisjZGVmaW5lIEdFVF9BQ0sJCQkxCisjZGVmaW5lIEZJWEVEX0NPTU0JCTgKKworI2RlZmluZSBBQ0sJCQkweGZmCisKK3N0cnVjdCBkc3Rfc3RhdGUgeworCisJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CisKKwlzdHJ1Y3QgYnQ4NzgqIGJ0OworCisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOworCisJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCWNvbnN0IHN0cnVjdCBkc3RfY29uZmlnKiBjb25maWc7CisKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCisJLyogcHJpdmF0ZSBBU0lDIGRhdGEgKi8KKwl1OCB0eF90dW5hWzEwXTsKKwl1OCByeF90dW5hWzEwXTsKKwl1OCByeGJ1ZmZlclsxMF07CisJdTggZGlzZXFfZmxhZ3M7CisJdTggZHN0X3R5cGU7CisJdTMyIHR5cGVfZmxhZ3M7CisJdTMyIGZyZXF1ZW5jeTsJCS8qIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaW4ga0h6IGZvciBRUFNLICovCisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uOworCXUzMiBzeW1ib2xfcmF0ZTsJLyogc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICovCisJZmVfY29kZV9yYXRlX3QgZmVjOworCWZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZTsKKwlmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZTsKKwl1MzIgZGVjb2RlX2ZyZXE7CisJdTggZGVjb2RlX2xvY2s7CisJdTE2IGRlY29kZV9zdHJlbmd0aDsKKwl1MTYgZGVjb2RlX3NucjsKKwl1bnNpZ25lZCBsb25nIGN1cl9qaWZmOworCXU4IGsyMjsKKwlmZV9iYW5kd2lkdGhfdCBiYW5kd2lkdGg7CisJdTMyIGRzdF9od19jYXA7CisJdTggZHN0X2Z3X3ZlcnNpb247CisJZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZDsKKwl1OCBtZXNzYWdlc1syNTZdOworfTsKKworc3RydWN0IGRzdF90eXBlcyB7CisJY2hhciAqZGV2aWNlX2lkOworCWludCBvZmZzZXQ7CisJdTggZHN0X3R5cGU7CisJdTMyIHR5cGVfZmxhZ3M7CisJdTMyIGRzdF9mZWF0dXJlOworfTsKKworCisKK3N0cnVjdCBkc3RfY29uZmlnCit7CisJLyogdGhlIEFTSUMgaTJjIGFkZHJlc3MgKi8KKwl1OCBkZW1vZF9hZGRyZXNzOworfTsKKworCitpbnQgcmRjX3Jlc2V0X3N0YXRlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKTsKK2ludCByZGNfODgyMF9yZXNldChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSk7CisKK2ludCBkc3Rfd2FpdF9kc3RfcmVhZHkoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4IGRlbGF5X21vZGUpOworaW50IGRzdF9waW9fZW5hYmxlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKTsKK2ludCBkc3RfcGlvX2Rpc2FibGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpOworaW50IGRzdF9lcnJvcl9yZWNvdmVyeShzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSk7CitpbnQgZHN0X2Vycm9yX2JhaWxvdXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpOworaW50IGRzdF9jb21tX2luaXQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpOworCitpbnQgd3JpdGVfZHN0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqIGRhdGEsIHU4IGxlbik7CitpbnQgcmVhZF9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmV0LCB1OCBsZW4pOwordTggZHN0X2NoZWNrX3N1bSh1OCAqIGJ1ZiwgdTMyIGxlbik7CitzdHJ1Y3QgZHN0X3N0YXRlKiBkc3RfYXR0YWNoKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKTsKK2ludCBkc3RfY2FfYXR0YWNoKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKTsKK2ludCBkc3RfZ3Bpb19vdXRiKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCB1MzIgbWFzaywgdTMyIGVuYmIsIHUzMiBvdXRoaWdoLCBpbnQgZGVsYXkpOworCitpbnQgZHN0X2NvbW1hbmQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHU4ICogZGF0YSwgdTggbGVuKTsKKworCisjZW5kaWYgLy8gRFNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X3ByaXYuaAppbmRleCA4MDQ4OGFhLi4zOTc0YTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9wcml2LmgKQEAgLTMzLDQgKzMzLDMgQEAKIHN0cnVjdCBidDg3ODsKIAogaW50IGJ0ODc4X2RldmljZV9jb250cm9sKHN0cnVjdCBidDg3OCAqYnQsIHVuc2lnbmVkIGludCBjbWQsIHVuaW9uIGRzdF9ncGlvX3BhY2tldCAqbXApOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IGI3MzUzOTcuLjZmODU3YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWRjX2N0bF8xX2NmZywgc2l6ZW9mKG10MzUyX2FkY19jdGxfMV9jZmcpKTsKIAogCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfY2ZnLCBzaXplb2YobXQzNTJfYWdjX2NmZykpOwotICAgICAgICBtdDM1Ml93cml0ZShmZSwgbXQzNTJfZ3BwX2N0bF9jZmcsIHNpemVvZihtdDM1Ml9ncHBfY3RsX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9ncHBfY3RsX2NmZywgc2l6ZW9mKG10MzUyX2dwcF9jdGxfY2ZnKSk7CiAJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2NhcHRfcmFuZ2VfY2ZnLCBzaXplb2YobXQzNTJfY2FwdF9yYW5nZV9jZmcpKTsKIAogCXJldHVybiAwOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3NzEwMDAwMDApIGNwID0gMHhiYzsKIAllbHNlIGNwID0gMHhmNDsKIAotICAgICAgICBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPT0gMCkgYnMgPSAweDAzOworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA9PSAwKSBicyA9IDB4MDM7CiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NDMyNTAwMDApIGJzID0gMHgwMjsKIAllbHNlIGJzID0gMHgwODsKIApAQCAtMTkwLDQ0ICsxOTAsNDQgQEAKIAogCiAgICB1MzIgb3NjaVtdPXs5NTAwMDAsMTAxOTAwMCwxMDc1MDAwLDExNzgwMDAsMTI5NjAwMCwxNDMyMDAwLAotICAgICAgICAgICAgICAgMTU3NjAwMCwxNzE4MDAwLDE4NTYwMDAsMjAzNjAwMCwyMTUwMDAwfTsKKwkgICAgICAgMTU3NjAwMCwxNzE4MDAwLDE4NTYwMDAsMjAzNjAwMCwyMTUwMDAwfTsKICAgIHUzMiBiYW5kc2VsW109ezAsMHgwMDAyMDAwMCwweDAwMDQwMDAwLDB4MDAxMDA4MDAsMHgwMDEwMTAwMCwKLSAgICAgICAgICAgICAgIDB4MDAxMDIwMDAsMHgwMDEwNDAwMCwweDAwMTA4MDAwLDB4MDAxMTAwMDAsCi0gICAgICAgICAgICAgICAweDAwMTIwMDAwLDB4MDAxNDAwMDB9OworCSAgICAgICAweDAwMTAyMDAwLDB4MDAxMDQwMDAsMHgwMDEwODAwMCwweDAwMTEwMDAwLAorCSAgICAgICAweDAwMTIwMDAwLDB4MDAxNDAwMDB9OwogCiAjZGVmaW5lIFhUQUwgMTAxMTEwMCAvKiBIeiwgcmVhbGx5IDEuMDExMSBNSHogYW5kIGEgLzEwIHByZXNjYWxlciAqLwotICAgICAgICBwcmludGsoImN4MjQxMDggZGVidWc6IGVudGVyaW5nIFNldFR1bmVyRnJlcSwgZnJlcT0lZFxuIixmcmVxKTsKKwlwcmludGsoImN4MjQxMDggZGVidWc6IGVudGVyaW5nIFNldFR1bmVyRnJlcSwgZnJlcT0lZFxuIixmcmVxKTsKIAotICAgICAgICAvKiBUaGlzIGlzIHJlYWxseSB0aGUgYml0IGRyaXZpbmcgdGhlIHR1bmVyIGNoaXAgY3gyNDEwOCAqLworCS8qIFRoaXMgaXMgcmVhbGx5IHRoZSBiaXQgZHJpdmluZyB0aGUgdHVuZXIgY2hpcCBjeDI0MTA4ICovCiAKLSAgICAgICAgaWYoZnJlcTw5NTAwMDApIGZyZXE9OTUwMDAwOyAvKiBrSHogKi8KLSAgICAgICAgaWYoZnJlcT4yMTUwMDAwKSBmcmVxPTIxNTAwMDA7IC8qIHNhdGVsbGl0ZSBJRiBpcyA5NTAuLjIxNTBNSHogKi8KKwlpZihmcmVxPDk1MDAwMCkgZnJlcT05NTAwMDA7IC8qIGtIeiAqLworCWlmKGZyZXE+MjE1MDAwMCkgZnJlcT0yMTUwMDAwOyAvKiBzYXRlbGxpdGUgSUYgaXMgOTUwLi4yMTUwTUh6ICovCiAKLSAgICAgICAgLyogZGVjaWRlIHdoaWNoIFZDTyB0byB1c2UgZm9yIHRoZSBpbnB1dCBmcmVxdWVuY3kgKi8KLSAgICAgICAgZm9yKGk9MTsoaTxzaXplb2Yob3NjaSkvc2l6ZW9mKG9zY2lbMF0pKSYmKG9zY2lbaV08ZnJlcSk7aSsrKTsKLSAgICAgICAgcHJpbnRrKCJjeDI0MTA4IGRlYnVnOiBzZWxlY3QgdmNvICMlZCAoZj0lZClcbiIsaSxmcmVxKTsKLSAgICAgICAgYmFuZD1iYW5kc2VsW2ldOwotICAgICAgICAvKiB0aGUgZ2FpbiB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgU2V0U3ltYm9scmF0ZSAqLwotICAgICAgICAvKiBjb21wdXRlIHRoZSBwbGwgZGl2aWRlciBuZWVkZWQsIGZyb20gQ29uZXhhbnQgZGF0YSBzaGVldCwKLSAgICAgICAgICAgcmVzb2x2ZWQgZm9yIChuKjMyK2EpLCByZW1lbWJlciBmKHZjbykgaXMgZihyZWNlaXZlKSAqMiBvciAqNCwKLSAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBkaXZpZGVyIGJpdC4gSXQgaXMgc2V0IHRvIC80IG9uIHRoZSAyIGxvd2VzdAotICAgICAgICAgICBiYW5kcyAgKi8KLSAgICAgICAgbj0oKGk8PTI/MjoxKSpmcmVxKjEwTCkvKFhUQUwvMTAwKTsKLSAgICAgICAgYT1uJTMyOyBuLz0zMjsgaWYoYT09MCkgbi0tOwotICAgICAgICBwdW1wPShmcmVxPChvc2NpW2ktMV0rb3NjaVtpXSkvMik7Ci0gICAgICAgIHBsbD0weGY4MDAwMDAwfAotICAgICAgICAgICAgKChwdW1wPzE6Mik8PCgxNCsxMSkpfAotICAgICAgICAgICAgKChuJjB4MWZmKTw8KDUrMTEpKXwKLSAgICAgICAgICAgICgoYSYweDFmKTw8MTEpOwotICAgICAgICAvKiBldmVyeXRoaW5nIGlzIHNoaWZ0ZWQgbGVmdCAxMSBiaXRzIHRvIGxlZnQtYWxpZ24gdGhlIGJpdHMgaW4gdGhlCi0gICAgICAgICAgIDMyYml0IHdvcmQuIE91dHB1dCB0byB0aGUgdHVuZXIgZ29lcyBNU0ItYWxpZ25lZCwgYWZ0ZXIgYWxsICovCi0gICAgICAgIHByaW50aygiY3gyNDEwOCBkZWJ1ZzogcHVtcD0lZCwgbj0lZCwgYT0lZFxuIixwdW1wLG4sYSk7Ci0gICAgICAgIGN4MjQxMTBfcGxsX3dyaXRlKGZlLGJhbmQpOwotICAgICAgICAvKiBzZXQgdmdhIGFuZCB2Y2EgdG8gdGhlaXIgd2lkZXN0LWJhbmQgc2V0dGluZ3MsIGFzIGEgcHJlY2F1dGlvbi4KLSAgICAgICAgICAgU2V0U3ltYm9scmF0ZSBtaWdodCBub3QgYmUgY2FsbGVkIHRvIHNldCB0aGlzIHVwICovCi0gICAgICAgIGN4MjQxMTBfcGxsX3dyaXRlKGZlLDB4NTAwYzAwMDApOwotICAgICAgICBjeDI0MTEwX3BsbF93cml0ZShmZSwweDgzZjFmODAwKTsKLSAgICAgICAgY3gyNDExMF9wbGxfd3JpdGUoZmUscGxsKTsKKwkvKiBkZWNpZGUgd2hpY2ggVkNPIHRvIHVzZSBmb3IgdGhlIGlucHV0IGZyZXF1ZW5jeSAqLworCWZvcihpPTE7KGk8c2l6ZW9mKG9zY2kpL3NpemVvZihvc2NpWzBdKSkmJihvc2NpW2ldPGZyZXEpO2krKyk7CisJcHJpbnRrKCJjeDI0MTA4IGRlYnVnOiBzZWxlY3QgdmNvICMlZCAoZj0lZClcbiIsaSxmcmVxKTsKKwliYW5kPWJhbmRzZWxbaV07CisJLyogdGhlIGdhaW4gdmFsdWVzIG11c3QgYmUgc2V0IGJ5IFNldFN5bWJvbHJhdGUgKi8KKwkvKiBjb21wdXRlIHRoZSBwbGwgZGl2aWRlciBuZWVkZWQsIGZyb20gQ29uZXhhbnQgZGF0YSBzaGVldCwKKwkgICByZXNvbHZlZCBmb3IgKG4qMzIrYSksIHJlbWVtYmVyIGYodmNvKSBpcyBmKHJlY2VpdmUpICoyIG9yICo0LAorCSAgIGRlcGVuZGluZyBvbiB0aGUgZGl2aWRlciBiaXQuIEl0IGlzIHNldCB0byAvNCBvbiB0aGUgMiBsb3dlc3QKKwkgICBiYW5kcyAgKi8KKwluPSgoaTw9Mj8yOjEpKmZyZXEqMTBMKS8oWFRBTC8xMDApOworCWE9biUzMjsgbi89MzI7IGlmKGE9PTApIG4tLTsKKwlwdW1wPShmcmVxPChvc2NpW2ktMV0rb3NjaVtpXSkvMik7CisJcGxsPTB4ZjgwMDAwMDB8CisJICAgICgocHVtcD8xOjIpPDwoMTQrMTEpKXwKKwkgICAgKChuJjB4MWZmKTw8KDUrMTEpKXwKKwkgICAgKChhJjB4MWYpPDwxMSk7CisJLyogZXZlcnl0aGluZyBpcyBzaGlmdGVkIGxlZnQgMTEgYml0cyB0byBsZWZ0LWFsaWduIHRoZSBiaXRzIGluIHRoZQorCSAgIDMyYml0IHdvcmQuIE91dHB1dCB0byB0aGUgdHVuZXIgZ29lcyBNU0ItYWxpZ25lZCwgYWZ0ZXIgYWxsICovCisJcHJpbnRrKCJjeDI0MTA4IGRlYnVnOiBwdW1wPSVkLCBuPSVkLCBhPSVkXG4iLHB1bXAsbixhKTsKKwljeDI0MTEwX3BsbF93cml0ZShmZSxiYW5kKTsKKwkvKiBzZXQgdmdhIGFuZCB2Y2EgdG8gdGhlaXIgd2lkZXN0LWJhbmQgc2V0dGluZ3MsIGFzIGEgcHJlY2F1dGlvbi4KKwkgICBTZXRTeW1ib2xyYXRlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgdG8gc2V0IHRoaXMgdXAgKi8KKwljeDI0MTEwX3BsbF93cml0ZShmZSwweDUwMGMwMDAwKTsKKwljeDI0MTEwX3BsbF93cml0ZShmZSwweDgzZjFmODAwKTsKKwljeDI0MTEwX3BsbF93cml0ZShmZSxwbGwpOwogLyogICAgICAgIHdyaXRlcmVnKGNsaWVudCwweDU2LDB4N2YpOyovCiAKIAlyZXR1cm4gMDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCXN0YXRpYyB1OCBtdDM1Ml9yZXNldCBbXSA9IHsgMHg1MCwgMHg4MCB9OwogCXN0YXRpYyB1OCBtdDM1Ml9hZGNfY3RsXzFfY2ZnIFtdID0geyAweDhFLCAweDQwIH07CiAJc3RhdGljIHU4IG10MzUyX2FnY19jZmcgW10gPSB7IDB4NjcsIDB4MTAsIDB4MjMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4RkYsIDB4MDAsIDB4NDAsIDB4NDAgfTsKKwkJCQkgICAgICAgMHgwMCwgMHhGRiwgMHgwMCwgMHg0MCwgMHg0MCB9OwogCXN0YXRpYyB1OCBtdDM1Ml9hdjc3MV9leHRyYVtdID0geyAweEI1LCAweDdBIH07CiAJc3RhdGljIHU4IG10MzUyX2NhcHRfcmFuZ2VfY2ZnW10gPSB7IDB4NzUsIDB4MzIgfTsKIApAQCAtNDYzLDYgKzQ2Myw5IEBACiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkLCB1MzIgdHlwZSkKIHsKKwlpbnQgcmV0OworCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gTlVMTDsKKwogCXN3aXRjaCh0eXBlKSB7CiAjaWZkZWYgQlRUVl9EVklDT19EVkJUX0xJVEUKIAljYXNlIEJUVFZfRFZJQ09fRFZCVF9MSVRFOgpAQCAtNTAzLDcgKzUwNiwyNSBAQAogCQlicmVhazsKIAogCWNhc2UgQlRUVl9UV0lOSEFOX0RTVDoKLQkJY2FyZC0+ZmUgPSBkc3RfYXR0YWNoKCZkc3RfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlciwgY2FyZC0+YnQpOworCQkvKglEU1QgaXMgbm90IGEgZnJvbnRlbmQgZHJpdmVyICEhIQkJKi8KKwkJc3RhdGUgPSAoc3RydWN0IGRzdF9zdGF0ZSAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGRzdF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQkvKglTZXR1cCB0aGUgQ2FyZAkJCQkJKi8KKwkJc3RhdGUtPmNvbmZpZyA9ICZkc3RfY29uZmlnOworCQlzdGF0ZS0+aTJjID0gY2FyZC0+aTJjX2FkYXB0ZXI7CisJCXN0YXRlLT5idCA9IGNhcmQtPmJ0OworCisJCS8qCURTVCBpcyBub3QgYSBmcm9udGVuZCwgYXR0YWNoaW5nIHRoZSBBU0lDCSovCisJCWlmICgoZHN0X2F0dGFjaChzdGF0ZSwgJmNhcmQtPmR2Yl9hZGFwdGVyKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIlczogQ291bGQgbm90IGZpbmQgYSBUd2luaGFuIERTVC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJfQorCQljYXJkLT5mZSA9ICZzdGF0ZS0+ZnJvbnRlbmQ7CisKKwkJLyoJQXR0YWNoIG90aGVyIERTVCBwZXJpcGhlcmFscyBpZiBhbnkJCSovCisJCS8qCUNvbmRpdGlvbmFsIEFjY2VzcyBkZXZpY2UJCQkqLworCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpIHsKKwkJCXJldCA9IGRzdF9jYV9hdHRhY2goc3RhdGUsICZjYXJkLT5kdmJfYWRhcHRlcik7CisJCX0KIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKIAkJCWJyZWFrOwogCQl9CkBAIC01MzEsNyArNTUyLDcgQEAKIAkJICAgICAgIGNhcmQtPmJ0LT5kZXYtPnN1YnN5c3RlbV92ZW5kb3IsCiAJCSAgICAgICBjYXJkLT5idC0+ZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAl9IGVsc2UgewotCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5mZSkpIHsKKwkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmZlKSkgewogCQkJcHJpbnRrKCJkdmItYnQ4eHg6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAkJCWlmIChjYXJkLT5mZS0+b3BzLT5yZWxlYXNlKQogCQkJCWNhcmQtPmZlLT5vcHMtPnJlbGVhc2UoY2FyZC0+ZmUpOwpAQCAtNTUwLDcgKzU3MSw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAKIAl9Ci0JY2FyZC0+ZHZiX2FkYXB0ZXItPnByaXYgPSBjYXJkOworCWNhcmQtPmR2Yl9hZGFwdGVyLnByaXYgPSBjYXJkOwogCiAJY2FyZC0+YnQtPmFkYXB0ZXIgPSBjYXJkLT5pMmNfYWRhcHRlcjsKIApAQCAtNTY4LDcgKzU4OSw3IEBACiAJaWYgKChyZXN1bHQgPSBkdmJfZG14X2luaXQoJmNhcmQtPmRlbXV4KSkgPCAwKSB7CiAJCXByaW50aygiZHZiX2J0OHh4OiBkdmJfZG14X2luaXQgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwgcmVzdWx0KTsKIAotCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGNhcmQtPmR2Yl9hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTc2LDExICs1OTcsMTEgQEAKIAljYXJkLT5kbXhkZXYuZGVtdXggPSAmY2FyZC0+ZGVtdXguZG14OwogCWNhcmQtPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwogCi0JaWYgKChyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJmNhcmQtPmRteGRldiwgY2FyZC0+ZHZiX2FkYXB0ZXIpKSA8IDApIHsKKwlpZiAoKHJlc3VsdCA9IGR2Yl9kbXhkZXZfaW5pdCgmY2FyZC0+ZG14ZGV2LCAmY2FyZC0+ZHZiX2FkYXB0ZXIpKSA8IDApIHsKIAkJcHJpbnRrKCJkdmJfYnQ4eHg6IGR2Yl9kbXhkZXZfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLCByZXN1bHQpOwogCiAJCWR2Yl9kbXhfcmVsZWFzZSgmY2FyZC0+ZGVtdXgpOwotCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGNhcmQtPmR2Yl9hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTkxLDcgKzYxMiw3IEBACiAKIAkJZHZiX2RteGRldl9yZWxlYXNlKCZjYXJkLT5kbXhkZXYpOwogCQlkdmJfZG14X3JlbGVhc2UoJmNhcmQtPmRlbXV4KTsKLQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihjYXJkLT5kdmJfYWRhcHRlcik7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmNhcmQtPmR2Yl9hZGFwdGVyKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTYwMyw3ICs2MjQsNyBAQAogCQljYXJkLT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZjYXJkLT5kZW11eC5kbXgsICZjYXJkLT5mZV9odyk7CiAJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2FyZC0+ZG14ZGV2KTsKIAkJZHZiX2RteF9yZWxlYXNlKCZjYXJkLT5kZW11eCk7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoY2FyZC0+ZHZiX2FkYXB0ZXIpOworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC02MTQsMTEgKzYzNSwxMSBAQAogCQljYXJkLT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZjYXJkLT5kZW11eC5kbXgsICZjYXJkLT5mZV9odyk7CiAJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2FyZC0+ZG14ZGV2KTsKIAkJZHZiX2RteF9yZWxlYXNlKCZjYXJkLT5kZW11eCk7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoY2FyZC0+ZHZiX2FkYXB0ZXIpOworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JZHZiX25ldF9pbml0KGNhcmQtPmR2Yl9hZGFwdGVyLCAmY2FyZC0+ZHZibmV0LCAmY2FyZC0+ZGVtdXguZG14KTsKKwlkdmJfbmV0X2luaXQoJmNhcmQtPmR2Yl9hZGFwdGVyLCAmY2FyZC0+ZHZibmV0LCAmY2FyZC0+ZGVtdXguZG14KTsKIAogCXRhc2tsZXRfaW5pdCgmY2FyZC0+YnQtPnRhc2tsZXQsIGR2Yl9idDh4eF90YXNrLCAodW5zaWduZWQgbG9uZykgY2FyZCk7CiAKQEAgLTY0OCw3ICs2NjksNyBAQAogCWNhc2UgQlRUVl9QSU5OQUNMRVNBVDoKIAkJY2FyZC0+Z3Bpb19tb2RlID0gMHgwNDAwYzA2MDsKIAkJLyogc2hvdWxkIGJlOiBCVDg3OF9BX0dBSU49MCxCVDg3OF9BX1BXUkROLEJUODc4X0RBX0RQTSxCVDg3OF9EQV9TQlIsCi0JCSAgICAgICAgICAgICAgQlQ4NzhfREFfSU9NPTEsQlQ4NzhfREFfQVBQIHRvIGVuYWJsZSBzZXJpYWwgaGlnaHNwZWVkIG1vZGUuICovCisJCQkgICAgICBCVDg3OF9EQV9JT009MSxCVDg3OF9EQV9BUFAgdG8gZW5hYmxlIHNlcmlhbCBoaWdoc3BlZWQgbW9kZS4gKi8KIAkJY2FyZC0+b3Bfc3luY19vcmluID0gMDsKIAkJY2FyZC0+aXJxX2Vycl9pZ25vcmUgPSAwOwogCQlicmVhazsKQEAgLTc1OSw3ICs3ODAsNyBAQAogCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2FyZC0+ZG14ZGV2KTsKIAlkdmJfZG14X3JlbGVhc2UoJmNhcmQtPmRlbXV4KTsKIAlpZiAoY2FyZC0+ZmUpIGR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGNhcmQtPmZlKTsKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGNhcmQtPmR2Yl9hZGFwdGVyKTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlcik7CiAKIAlrZnJlZShjYXJkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAppbmRleCA4MGVmMTg5Li4yOTIzYjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgImJ0dHYuaCIKICNpbmNsdWRlICJtdDM1Mi5oIgogI2luY2x1ZGUgInNwODg3eC5oIgotI2luY2x1ZGUgImRzdC5oIgorI2luY2x1ZGUgImRzdF9jb21tb24uaCIKICNpbmNsdWRlICJueHQ2MDAwLmgiCiAjaW5jbHVkZSAiY3gyNDExMC5oIgogI2luY2x1ZGUgIm9yNTEyMTEuaCIKQEAgLTQwLDcgKzQwLDcgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAJaW50IG5mZWVkczsKIAljaGFyIGNhcmRfbmFtZVszMl07Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXB0ZXI7CiAJc3RydWN0IGJ0ODc4ICpidDsKIAl1bnNpZ25lZCBpbnQgYnR0dl9ucjsKIAlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCmluZGV4IDI4ZDRkOTIuLjk2YzU3ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCXN0cnVjdCBkdmJfZGVtdXggZGVtdXg7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHNlbWFwaG9yZSBzZW07Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBkdmJfYWRhcHRlciBhZGFwdGVyOwogCXN0cnVjdCBkdmJfZGV2aWNlICpmZWRldjsKIAlzdHJ1Y3QgZG14ZGV2IGRteGRldjsKIAlzdHJ1Y3QgZHZiX25ldCBkdmJuZXQ7CkBAIC04MTMsMTUgKzgxMywxNSBAQAogCWNpbmVyZ3l0Mi0+ZG14ZGV2LmRlbXV4ID0gJmNpbmVyZ3l0Mi0+ZGVtdXguZG14OwogCWNpbmVyZ3l0Mi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7CiAKLQlpZiAoKGVyciA9IGR2Yl9kbXhkZXZfaW5pdCgmY2luZXJneXQyLT5kbXhkZXYsIGNpbmVyZ3l0Mi0+YWRhcHRlcikpIDwgMCkgeworCWlmICgoZXJyID0gZHZiX2RteGRldl9pbml0KCZjaW5lcmd5dDItPmRteGRldiwgJmNpbmVyZ3l0Mi0+YWRhcHRlcikpIDwgMCkgewogCQlkcHJpbnRrKDEsICJkdmJfZG14ZGV2X2luaXQoKSBmYWlsZWQgKGVyciA9ICVkKVxuIiwgZXJyKTsKIAkJZ290byBiYWlsb3V0OwogCX0KIAotCWlmIChkdmJfbmV0X2luaXQoY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5kdmJuZXQsICZjaW5lcmd5dDItPmRlbXV4LmRteCkpCisJaWYgKGR2Yl9uZXRfaW5pdCgmY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5kdmJuZXQsICZjaW5lcmd5dDItPmRlbXV4LmRteCkpCiAJCWRwcmludGsoMSwgImR2Yl9uZXRfaW5pdCgpIGZhaWxlZCFcbiIpOwogCi0JZHZiX3JlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPmFkYXB0ZXIsICZjaW5lcmd5dDItPmZlZGV2LAorCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZmVkZXYsCiAJCQkgICAgJmNpbmVyZ3l0Ml9mZV90ZW1wbGF0ZSwgY2luZXJneXQyLAogCQkJICAgIERWQl9ERVZJQ0VfRlJPTlRFTkQpOwogCkBAIC04NDgsNyArODQ4LDcgQEAKIGJhaWxvdXQ6CiAJZHZiX2RteGRldl9yZWxlYXNlKCZjaW5lcmd5dDItPmRteGRldik7CiAJZHZiX2RteF9yZWxlYXNlKCZjaW5lcmd5dDItPmRlbXV4KTsKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyIChjaW5lcmd5dDItPmFkYXB0ZXIpOworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKCZjaW5lcmd5dDItPmFkYXB0ZXIpOwogCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzIChjaW5lcmd5dDIpOwogCWtmcmVlKGNpbmVyZ3l0Mik7CiAJcmV0dXJuIC1FTk9NRU07CkBAIC04NzIsNyArODcyLDcgQEAKIAlkdmJfZG14ZGV2X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZG14ZGV2KTsKIAlkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwogCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPmZlZGV2KTsKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGNpbmVyZ3l0Mi0+YWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyKTsKIAogCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7CiAJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZHZiLmMKaW5kZXggMDRlNTRlYy4uNDAwYjQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZHZiLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlkZWJfaW5mbygiZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgZmFpbGVkOiBlcnJvciAlZCIsIHJldCk7CiAJCWdvdG8gZXJyOwogCX0KLQlkaWItPmFkYXB0ZXItPnByaXYgPSBkaWI7CisJZGliLT5hZGFwdGVyLnByaXYgPSBkaWI7CiAJCiAvKiBpMmMgaXMgZG9uZSBpbiBkaWJ1c2JfaTJjX2luaXQgKi8KIAkKQEAgLTE1MSwxOCArMTUxLDE4IEBACiAJZGliLT5kbXhkZXYuZmlsdGVybnVtID0gZGliLT5kZW11eC5maWx0ZXJudW07CiAJZGliLT5kbXhkZXYuZGVtdXggPSAmZGliLT5kZW11eC5kbXg7CiAJZGliLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKLQlpZiAoKHJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmZGliLT5kbXhkZXYsIGRpYi0+YWRhcHRlcikpIDwgMCkgeworCWlmICgocmV0ID0gZHZiX2RteGRldl9pbml0KCZkaWItPmRteGRldiwgJmRpYi0+YWRhcHRlcikpIDwgMCkgewogCQllcnIoImR2Yl9kbXhkZXZfaW5pdCBmYWlsZWQ6IGVycm9yICVkIixyZXQpOwogCQlnb3RvIGVycl9kbXhfZGV2OwogCX0KIAotCWR2Yl9uZXRfaW5pdChkaWItPmFkYXB0ZXIsICZkaWItPmR2Yl9uZXQsICZkaWItPmRlbXV4LmRteCk7CisJZHZiX25ldF9pbml0KCZkaWItPmFkYXB0ZXIsICZkaWItPmR2Yl9uZXQsICZkaWItPmRlbXV4LmRteCk7CiAKIAlnb3RvIHN1Y2Nlc3M7CiBlcnJfZG14X2RldjoKIAlkdmJfZG14X3JlbGVhc2UoJmRpYi0+ZGVtdXgpOwogZXJyX2RteDoKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGRpYi0+YWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZGliLT5hZGFwdGVyKTsKIGVycjoKIAlyZXR1cm4gcmV0Owogc3VjY2VzczoKQEAgLTE3OSw3ICsxNzksNyBAQAogCQlkaWItPmRlbXV4LmRteC5jbG9zZSgmZGliLT5kZW11eC5kbXgpOwogCQlkdmJfZG14ZGV2X3JlbGVhc2UoJmRpYi0+ZG14ZGV2KTsKIAkJZHZiX2RteF9yZWxlYXNlKCZkaWItPmRlbXV4KTsKLQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkaWItPmFkYXB0ZXIpOworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkaWItPmFkYXB0ZXIpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLWZlLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmUtaTJjLmMKaW5kZXggMmVkODk0OC4uNWE3MWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmUtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmUtaTJjLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCQkgICAgICAgZGliLT5kaWJkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UgewotCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGRpYi0+YWRhcHRlciwgZGliLT5mZSkpIHsKKwkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZGliLT5hZGFwdGVyLCBkaWItPmZlKSkgewogCQkJZXJyKCJGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkLiIpOwogCQkJaWYgKGRpYi0+ZmUtPm9wcy0+cmVsZWFzZSkKIAkJCQlkaWItPmZlLT5vcHMtPnJlbGVhc2UoZGliLT5mZSk7CkBAIC0yMDYsNyArMjA2LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWRpYi0+YWRhcHRlci0+cHJpdiA9IGRpYjsKKwlkaWItPmFkYXB0ZXIucHJpdiA9IGRpYjsKIAogCXN0cm5jcHkoZGliLT5pMmNfYWRhcC5uYW1lLGRpYi0+ZGliZGV2LT5uYW1lLEkyQ19OQU1FX1NJWkUpOwogI2lmZGVmIEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi5oCmluZGV4IDUyY2QzNWQuLmM5NjViNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2IuaApAQCAtMTgxLDcgKzE4MSw3IEBACiAJc3RydWN0IHNlbWFwaG9yZSBpMmNfc2VtOwogCiAJLyogZHZiICovCi0Jc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBkdmJfYWRhcHRlciBhZGFwdGVyOwogCXN0cnVjdCBkbXhkZXYgZG14ZGV2OwogCXN0cnVjdCBkdmJfZGVtdXggZGVtdXg7CiAJc3RydWN0IGR2Yl9uZXQgZHZiX25ldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKaW5kZXggMTg2M2YxZC4uYzIyNWRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKQEAgLTE3NSw4ICsxNzUsOCBAQAogCiBzdGF0aWMgaW50IGR2Yl9kdnJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2PShzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRteGRldiAqZG14ZGV2PShzdHJ1Y3QgZG14ZGV2ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGR2YmRldi0+cHJpdjsKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udDsKIAogCWRwcmludGsgKCJmdW5jdGlvbiA6ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjI0LDggKzIyNCw4IEBACiAKIHN0YXRpYyBpbnQgZHZiX2R2cl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY9KHN0cnVjdCBkdmJfZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXY9KHN0cnVjdCBkbXhkZXYgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRteGRldiAqZG14ZGV2ID0gZHZiZGV2LT5wcml2OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRteGRldi0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwpAQCAtMjUyLDggKzI1Miw4IEBACiBzdGF0aWMgc3NpemVfdCBkdmJfZHZyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2PShzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRteGRldiAqZG14ZGV2PShzdHJ1Y3QgZG14ZGV2ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGR2YmRldi0+cHJpdjsKIAlpbnQgcmV0OwogCiAJaWYgKCFkbXhkZXYtPmRlbXV4LT53cml0ZSkKQEAgLTI3MCw4ICsyNzAsOCBAQAogc3RhdGljIHNzaXplX3QgZHZiX2R2cl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiAJCWxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2PShzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRteGRldiAqZG14ZGV2PShzdHJ1Y3QgZG14ZGV2ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGR2YmRldi0+cHJpdjsKIAlpbnQgcmV0OwogCiAJLy9kb3duKCZkbXhkZXYtPm11dGV4KTsKQEAgLTM0NSw3ICszNDUsNyBAQAogCQkJICAgIGNvbnN0IHU4ICpidWZmZXIyLCBzaXplX3QgYnVmZmVyMl9sZW4sCiAJCQkgICAgc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlciAqZmlsdGVyLCBlbnVtIGRteF9zdWNjZXNzIHN1Y2Nlc3MpCiB7Ci0Jc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlcj0oc3RydWN0IGRteGRldl9maWx0ZXIgKikgZmlsdGVyLT5wcml2OworCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBmaWx0ZXItPnByaXY7CiAJaW50IHJldDsKIAogCWlmIChkbXhkZXZmaWx0ZXItPmJ1ZmZlci5lcnJvcikgewpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCSAgICAgICBjb25zdCB1OCAqYnVmZmVyMiwgc2l6ZV90IGJ1ZmZlcjJfbGVuLAogCQkgICAgICAgc3RydWN0IGRteF90c19mZWVkICpmZWVkLCBlbnVtIGRteF9zdWNjZXNzIHN1Y2Nlc3MpCiB7Ci0Jc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlcj0oc3RydWN0IGRteGRldl9maWx0ZXIgKikgZmVlZC0+cHJpdjsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZmVlZC0+cHJpdjsKIAlzdHJ1Y3QgZG14ZGV2X2J1ZmZlciAqYnVmZmVyOwogCWludCByZXQ7CiAKQEAgLTY4NCw4ICs2ODQsOCBAQAogCiBzdGF0aWMgaW50IGR2Yl9kZW11eF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY9KHN0cnVjdCBkdmJfZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXY9KHN0cnVjdCBkbXhkZXYgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRteGRldiAqZG14ZGV2ID0gZHZiZGV2LT5wcml2OwogCWludCBpOwogCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXI7CiAKQEAgLTEwMTMsOCArMTAxMyw4IEBACiBzdGF0aWMgaW50IGR2Yl9kdnJfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2PShzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRteGRldiAqZG14ZGV2PShzdHJ1Y3QgZG14ZGV2ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGR2YmRldi0+cHJpdjsKIAogCWludCByZXQ9MDsKIApAQCAtMTA0NCw4ICsxMDQ0LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBkdmJfZHZyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSAoc3RydWN0IGR2Yl9kZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IChzdHJ1Y3QgZG14ZGV2ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbXhkZXYgKmRteGRldiA9IGR2YmRldi0+cHJpdjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlkcHJpbnRrICgiZnVuY3Rpb24gOiAlc1xuIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCmluZGV4IGMxZWE4OWYuLjBlYjlhYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYwpAQCAtODI5LDcgKzgyOSw3IEBACiAgKi8KIHZvaWQgZHZiX2NhX2VuNTAyMjFfY2FtY2hhbmdlX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKnB1YmNhLCBpbnQgc2xvdCwgaW50IGNoYW5nZV90eXBlKQogewotCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSAoc3RydWN0IGR2Yl9jYV9wcml2YXRlICopIHB1YmNhLT5wcml2YXRlOworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBwdWJjYS0+cHJpdmF0ZTsKIAogCWRwcmludGsoIkNBTUNIQU5HRSBJUlEgc2xvdDolaSBjaGFuZ2VfdHlwZTolaVxuIiwgc2xvdCwgY2hhbmdlX3R5cGUpOwogCkBAIC04NTcsNyArODU3LDcgQEAKICAqLwogdm9pZCBkdmJfY2FfZW41MDIyMV9jYW1yZWFkeV9pcnEoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpwdWJjYSwgaW50IHNsb3QpCiB7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgcHViY2EtPnByaXZhdGU7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IHB1YmNhLT5wcml2YXRlOwogCiAJZHByaW50aygiQ0FNUkVBRFkgSVJRIHNsb3Q6JWlcbiIsIHNsb3QpOwogCkBAIC04NzYsNyArODc2LDcgQEAKICAqLwogdm9pZCBkdmJfY2FfZW41MDIyMV9mcmRhX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKnB1YmNhLCBpbnQgc2xvdCkKIHsKLQlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqKSBwdWJjYS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gcHViY2EtPnByaXZhdGU7CiAJaW50IGZsYWdzOwogCiAJZHByaW50aygiRlIvREEgSVJRIHNsb3Q6JWlcbiIsIHNsb3QpOwpAQCAtOTkzLDcgKzk5Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfdGhyZWFkKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZGF0YTsKIAljaGFyIG5hbWVbMTVdOwogCWludCBzbG90OwogCWludCBmbGFnczsKQEAgLTEyMDIsOCArMTIwMiw4IEBACiBzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBhcmcpCiB7Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IChzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKIAlpbnQgZXJyID0gMDsKIAlpbnQgc2xvdDsKIApAQCAtMTIyNSw3ICsxMjI1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIENBX0dFVF9DQVA6IHsKLQkJc3RydWN0IGNhX2NhcHMgKmNhcHMgPSAoc3RydWN0IGNhX2NhcHMgKikgcGFyZzsKKwkJc3RydWN0IGNhX2NhcHMgKmNhcHMgPSBwYXJnOwogCiAJCWNhcHMtPnNsb3RfbnVtID0gY2EtPnNsb3RfY291bnQ7CiAJCWNhcHMtPnNsb3RfdHlwZSA9IENBX0NJX0xJTks7CkBAIC0xMjM1LDcgKzEyMzUsNyBAQAogCX0KIAogCWNhc2UgQ0FfR0VUX1NMT1RfSU5GTzogewotCQlzdHJ1Y3QgY2Ffc2xvdF9pbmZvICppbmZvID0gKHN0cnVjdCBjYV9zbG90X2luZm8gKikgcGFyZzsKKwkJc3RydWN0IGNhX3Nsb3RfaW5mbyAqaW5mbyA9IHBhcmc7CiAKIAkJaWYgKChpbmZvLT5udW0gPiBjYS0+c2xvdF9jb3VudCkgfHwgKGluZm8tPm51bSA8IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjkxLDggKzEyOTEsOCBAQAogc3RhdGljIHNzaXplX3QgZHZiX2NhX2VuNTAyMjFfaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IChzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKIAl1OCBzbG90LCBjb25uZWN0aW9uX2lkOwogCWludCBzdGF0dXM7CiAJY2hhciBmcmFnYnVmW0hPU1RfTElOS19CVUZfU0laRV07CkBAIC0xNDI4LDggKzE0MjgsOCBAQAogc3RhdGljIHNzaXplX3QgZHZiX2NhX2VuNTAyMjFfaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSAoc3RydWN0IGR2Yl9kZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSAoc3RydWN0IGR2Yl9jYV9wcml2YXRlICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBkdmJkZXYtPnByaXY7CiAJaW50IHN0YXR1czsKIAlpbnQgcmVzdWx0ID0gMDsKIAl1OCBoZHJbMl07CkBAIC0xNTI2LDggKzE1MjYsOCBAQAogICovCiBzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IChzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKIAlpbnQgZXJyOwogCWludCBpOwogCkBAIC0xNTY5LDggKzE1NjksOCBAQAogICovCiBzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IChzdHJ1Y3QgZHZiX2RldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikgZHZiZGV2LT5wcml2OworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKIAlpbnQgZXJyID0gMDsKIAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTU5Nyw4ICsxNTk3LDggQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBkdmJfY2FfZW41MDIyMV9pb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gKHN0cnVjdCBkdmJfZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqKSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAlpbnQgc2xvdDsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTE3NTAsNyArMTc1MCw3IEBACiAgKi8KIHZvaWQgZHZiX2NhX2VuNTAyMjFfcmVsZWFzZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKnB1YmNhKQogewotCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSAoc3RydWN0IGR2Yl9jYV9wcml2YXRlICopIHB1YmNhLT5wcml2YXRlOworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBwdWJjYS0+cHJpdmF0ZTsKIAlpbnQgaTsKIAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCA1OWE5YWRmLi5kMTkzMDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIGludCBkdmJfcG93ZXJkb3duX29uX3NsZWVwID0gMTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGZyb250ZW5kX2RlYnVnLCBkdmJfZnJvbnRlbmRfZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGR2Yl9mcm9udGVuZF9kZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGNvcmUgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CitNT0RVTEVfUEFSTV9ERVNDKGZyb250ZW5kX2RlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgY29yZSBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKIG1vZHVsZV9wYXJhbShkdmJfc2h1dGRvd25fdGltZW91dCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZHZiX3NodXRkb3duX3RpbWVvdXQsICJ3YWl0IDxzaHV0ZG93bl90aW1lb3V0PiBzZWNvbmRzIGFmdGVyIGNsb3NlKCkgYmVmb3JlIHN1c3BlbmRpbmcgaGFyZHdhcmUiKTsKIG1vZHVsZV9wYXJhbShkdmJfZm9yY2VfYXV0b19pbnZlcnNpb24sIGludCwgMDQ0NCk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAogc3RhdGljIHZvaWQgZHZiX2Zyb250ZW5kX2FkZF9ldmVudChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3Qgc3RhdHVzKQogewotCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSopIGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAJc3RydWN0IGR2Yl9mZV9ldmVudHMgKmV2ZW50cyA9ICZmZXByaXYtPmV2ZW50czsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50ICplOwogCWludCB3cDsKQEAgLTE1NSw3ICsxNTUsNyBAQAogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfZ2V0X2V2ZW50KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSAoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKikgZmUtPmZyb250ZW5kX3ByaXY7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKIAlzdHJ1Y3QgZHZiX2ZlX2V2ZW50cyAqZXZlbnRzID0gJmZlcHJpdi0+ZXZlbnRzOwogCiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjM0LDcgKzIzNCw3IEBACiB7CiAJaW50IGF1dG9pbnZlcnNpb247CiAJaW50IHJlYWR5ID0gMDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCWludCBvcmlnaW5hbF9pbnZlcnNpb24gPSBmZXByaXYtPnBhcmFtZXRlcnMuaW52ZXJzaW9uOwogCXUzMiBvcmlnaW5hbF9mcmVxdWVuY3kgPSBmZXByaXYtPnBhcmFtZXRlcnMuZnJlcXVlbmN5OwogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfaXNfZXhpdGluZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJaWYgKGZlcHJpdi0+ZXhpdCkKIAkJcmV0dXJuIDE7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfc2hvdWxkX3dha2V1cChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJaWYgKGZlcHJpdi0+d2FrZXVwKSB7CiAJCWZlcHJpdi0+d2FrZXVwID0gMDsKQEAgLTM0Niw3ICszNDYsNyBAQAogCiBzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfd2FrZXVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewotCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSopIGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAKIAlmZXByaXYtPndha2V1cCA9IDE7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmZXByaXYtPndhaXRfcXVldWUpOwpAQCAtMzU3LDggKzM1Nyw4IEBACiAgKi8KIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX3RocmVhZCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gKHN0cnVjdCBkdmJfZnJvbnRlbmQgKikgZGF0YTsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSA9IGRhdGE7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJY2hhciBuYW1lIFsxNV07CiAJaW50IHF1YWxpdHkgPSAwLCBkZWxheSA9IDMqSFo7CkBAIC01MjAsNyArNTIwLDcgQEAKIHN0YXRpYyB2b2lkIGR2Yl9mcm9udGVuZF9zdG9wKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXVuc2lnbmVkIGxvbmcgcmV0OwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSopIGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAKIAlkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTU1OSw3ICs1NTksNyBAQAogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfc3RhcnQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC01OTcsNyArNTk3LDcgQEAKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gZHZiZGV2LT5wcml2OwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSopIGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAJaW50IGVyciA9IC1FT1BOT1RTVVBQOwogCiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNjE1LDcgKzYxNSw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRkVfR0VUX0lORk86IHsKLQkJc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKiBpbmZvID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyopIHBhcmc7CisJCXN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyogaW5mbyA9IHBhcmc7CiAJCW1lbWNweShpbmZvLCAmZmUtPm9wcy0+aW5mbywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykpOwogCiAJCS8qIEZvcmNlIHRoZSBDQU5fSU5WRVJTSU9OX0FVVE8gYml0IG9uLiBJZiB0aGUgZnJvbnRlbmQgZG9lc24ndApAQCAtNzkzLDcgKzc5Myw3IEBACiB7CiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSA9IGR2YmRldi0+cHJpdjsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC04MDksNyArODA5LDcgQEAKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gZHZiZGV2LT5wcml2OwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gKHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSopIGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAJaW50IHJldDsKIAogCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTgzMyw3ICs4MzMsNyBAQAogewogCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBkdmJkZXYtPnByaXY7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSAoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKikgZmUtPmZyb250ZW5kX3ByaXY7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKIAogCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtODczLDcgKzg3Myw3IEBACiAJCXVwKCZmcm9udGVuZF9tdXRleCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmZXByaXYgPSAoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKikgZmUtPmZyb250ZW5kX3ByaXY7CisJZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAJbWVtc2V0KGZlLT5mcm9udGVuZF9wcml2LCAwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKSk7CiAKIAlpbml0X01VVEVYICgmZmVwcml2LT5zZW0pOwpAQCAtODk3LDcgKzg5Nyw3IEBACiAKIGludCBkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUqKSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAogCWRvd24gKCZmcm9udGVuZF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggNDQ4OTJlNy4uNmE5NjhjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwpAQCAtMzE1LDcgKzMxNSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGR2Yl9uZXRfdWxlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgYnVmX2xlbiApCiB7Ci0Jc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgZHZiX25ldF9wcml2ICopZGV2LT5wcml2OworCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBza2lwcGVkID0gMEw7CiAJdTggKnRzLCAqdHNfZW5kLCAqZnJvbV93aGVyZSA9IE5VTEwsIHRzX3JlbWFpbiA9IDAsIGhvd19tdWNoID0gMCwgbmV3X3RzID0gMTsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoID0gTlVMTDsKQEAgLTcwOSw3ICs3MDksNyBAQAogCQkJICAgICAgIGNvbnN0IHU4ICpidWZmZXIyLCBzaXplX3QgYnVmZmVyMl9sZW4sCiAJCQkgICAgICAgc3RydWN0IGRteF90c19mZWVkICpmZWVkLCBlbnVtIGRteF9zdWNjZXNzIHN1Y2Nlc3MpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWZlZWQtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlZWQtPnByaXY7CiAKIAlpZiAoYnVmZmVyMiAhPSAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJidWZmZXIyIG5vdCAwOiAlcC5cbiIsIGJ1ZmZlcjIpOwpAQCAtNzI3LDYgKzcyNyw3IEBACiAgICAgICAgIHU4ICpldGg7CiAgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJigoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMpOworCWludCBzbmFwID0gMDsKIAogCS8qIG5vdGU6IHBrdF9sZW4gaW5jbHVkZXMgYSAzMmJpdCBjaGVja3N1bSAqLwogCWlmIChwa3RfbGVuIDwgMTYpIHsKQEAgLTc1MCw5ICs3NTEsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAocGt0WzVdICYgMHgwMikgewotCQkvL0ZJWE1FOiBoYW5kbGUgTExDL1NOQVAKLSAgICAgICAgICAgICAgICBzdGF0cy0+cnhfZHJvcHBlZCsrOwotICAgICAgICAgICAgICAgIHJldHVybjsKKwkJLyogaGFuZGxlIExMQy9TTkFQLCBzZWUgcmZjLTEwNDIgKi8KKwkJaWYgKHBrdF9sZW4gPCAyNCB8fCBtZW1jbXAoJnBrdFsxMl0sICJceGFhXHhhYVx4MDNcMFwwXDAiLCA2KSkgeworCQkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJCXJldHVybjsKKwkJfQorCQlzbmFwID0gODsKICAgICAgICAgfQogCWlmIChwa3RbN10pIHsKIAkJLyogRklYTUU6IGFzc2VtYmxlIGRhdGFncmFtIGZyb20gbXVsdGlwbGUgc2VjdGlvbnMgKi8KQEAgLTc2Miw5ICs3NjYsOSBAQAogCX0KIAogCS8qIHdlIGhhdmUgMTQgYnl0ZSBldGhlcm5ldCBoZWFkZXIgKGlwIGhlYWRlciBmb2xsb3dzKTsKLQkgKiAxMiBieXRlIE1QRSBoZWFkZXI7IDQgYnl0ZSBjaGVja3N1bTsgKyAyIGJ5dGUgYWxpZ25tZW50CisJICogMTIgYnl0ZSBNUEUgaGVhZGVyOyA0IGJ5dGUgY2hlY2tzdW07ICsgMiBieXRlIGFsaWdubWVudCwgOCBieXRlIExMQy9TTkFQCiAJICovCi0JaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuIC0gNCAtIDEyICsgMTQgKyAyKSkpIHsKKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gLSA0IC0gMTIgKyAxNCArIDIgLSBzbmFwKSkpIHsKIAkJLy9wcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKIAkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwpAQCAtNzczLDggKzc3Nyw4IEBACiAJc2tiLT5kZXYgPSBkZXY7CiAKIAkvKiBjb3B5IEwzIHBheWxvYWQgKi8KLQlldGggPSAodTggKikgc2tiX3B1dChza2IsIHBrdF9sZW4gLSAxMiAtIDQgKyAxNCk7Ci0JbWVtY3B5KGV0aCArIDE0LCBwa3QgKyAxMiwgcGt0X2xlbiAtIDEyIC0gNCk7CisJZXRoID0gKHU4ICopIHNrYl9wdXQoc2tiLCBwa3RfbGVuIC0gMTIgLSA0ICsgMTQgLSBzbmFwKTsKKwltZW1jcHkoZXRoICsgMTQsIHBrdCArIDEyICsgc25hcCwgcGt0X2xlbiAtIDEyIC0gNCAtIHNuYXApOwogCiAJLyogY3JlYXRlIGV0aGVybmV0IGhlYWRlcjogKi8KICAgICAgICAgZXRoWzBdPXBrdFsweDBiXTsKQEAgLTc4Niw4ICs3OTAsMjEgQEAKIAogICAgICAgICBldGhbNl09ZXRoWzddPWV0aFs4XT1ldGhbOV09ZXRoWzEwXT1ldGhbMTFdPTA7CiAKLQlldGhbMTJdID0gMHgwODsJLyogRVRIX1BfSVAgKi8KLQlldGhbMTNdID0gMHgwMDsKKwlpZiAoc25hcCkgeworCQlldGhbMTJdID0gcGt0WzE4XTsKKwkJZXRoWzEzXSA9IHBrdFsxOV07CisJfSBlbHNlIHsKKwkJLyogcHJvdG9jb2wgbnVtYmVycyBhcmUgZnJvbSByZmMtMTcwMCBvcgorCQkgKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2V0aGVybmV0LW51bWJlcnMKKwkJICovCisJCWlmIChwa3RbMTJdID4+IDQgPT0gNikgeyAvKiB2ZXJzaW9uIGZpZWxkIGZyb20gSVAgaGVhZGVyICovCisJCQlldGhbMTJdID0gMHg4NjsJLyogSVB2NiAqLworCQkJZXRoWzEzXSA9IDB4ZGQ7CisJCX0gZWxzZSB7CisJCQlldGhbMTJdID0gMHgwODsJLyogSVB2NCAqLworCQkJZXRoWzEzXSA9IDB4MDA7CisJCX0KKwl9CiAKIAlza2ItPnByb3RvY29sID0gZHZiX25ldF9ldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKQEAgLTgwMSw3ICs4MTgsNyBAQAogCQkgc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlciAqZmlsdGVyLAogCQkgZW51bSBkbXhfc3VjY2VzcyBzdWNjZXNzKQogewotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PShzdHJ1Y3QgbmV0X2RldmljZSAqKSBmaWx0ZXItPnByaXY7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaWx0ZXItPnByaXY7CiAKIAkvKioKIAkgKiB3ZSByZWx5IG9uIHRoZSBEVkIgQVBJIGRlZmluaXRpb24gd2hlcmUgZXhhY3RseSBvbmUgY29tcGxldGUKQEAgLTgyNiw3ICs4NDMsNyBAQAogCQkgICBzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyICoqc2VjZmlsdGVyLAogCQkgICB1OCAqbWFjLCB1OCAqbWFjX21hc2spCiB7Ci0Jc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgZHZiX25ldF9wcml2KikgZGV2LT5wcml2OworCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAJaW50IHJldDsKIAogCSpzZWNmaWx0ZXI9TlVMTDsKQEAgLTg3MCw3ICs4ODcsNyBAQAogc3RhdGljIGludCBkdmJfbmV0X2ZlZWRfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0LCBpOwotCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSAoc3RydWN0IGR2Yl9uZXRfcHJpdiopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogICAgICAgICBzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCA9IHByaXYtPmRlbXV4OwogICAgICAgICB1bnNpZ25lZCBjaGFyICptYWMgPSAodW5zaWduZWQgY2hhciAqKSBkZXYtPmRldl9hZGRyOwogCkBAIC05NjUsNyArOTgyLDcgQEAKIAogc3RhdGljIGludCBkdmJfbmV0X2ZlZWRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSAoc3RydWN0IGR2Yl9uZXRfcHJpdiopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCWludCBpOwogCiAJZHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMDE2LDcgKzEwMzMsNyBAQAogCiBzdGF0aWMgaW50IGR2Yl9zZXRfbWNfZmlsdGVyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jKQogewotCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSAoc3RydWN0IGR2Yl9uZXRfcHJpdiopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCiAJaWYgKHByaXYtPm11bHRpX251bSA9PSBEVkJfTkVUX01VTFRJQ0FTVF9NQVgpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTAzMSw3ICsxMDQ4LDcgQEAKIHN0YXRpYyB2b2lkIHdxX3NldF9tdWx0aWNhc3RfbGlzdCAodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gKHN0cnVjdCBkdmJfbmV0X3ByaXYqKSBkZXYtPnByaXY7CisJc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAogCWR2Yl9uZXRfZmVlZF9zdG9wKGRldik7CiAKQEAgLTEwNjYsNyArMTA4Myw3IEBACiAKIHN0YXRpYyB2b2lkIGR2Yl9uZXRfc2V0X211bHRpY2FzdF9saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSAoc3RydWN0IGR2Yl9uZXRfcHJpdiopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXNjaGVkdWxlX3dvcmsoJnByaXYtPnNldF9tdWx0aWNhc3RfbGlzdF93cSk7CiB9CiAKQEAgLTEwODQsNyArMTEwMSw3IEBACiAKIHN0YXRpYyBpbnQgZHZiX25ldF9zZXRfbWFjIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQogewotCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPSAoc3RydWN0IGR2Yl9uZXRfcHJpdiopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXN0cnVjdCBzb2NrYWRkciAqYWRkcj1wOwogCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwpAQCAtMTA5OCw3ICsxMTE1LDcgQEAKIAogc3RhdGljIGludCBkdmJfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gKHN0cnVjdCBkdmJfbmV0X3ByaXYqKSBkZXYtPnByaXY7CisJc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAogCXByaXYtPmluX3VzZSsrOwogCWR2Yl9uZXRfZmVlZF9zdGFydChkZXYpOwpAQCAtMTEwOCw3ICsxMTI1LDcgQEAKIAogc3RhdGljIGludCBkdmJfbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gKHN0cnVjdCBkdmJfbmV0X3ByaXYqKSBkZXYtPnByaXY7CisJc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAogCXByaXYtPmluX3VzZS0tOwogICAgICAgICByZXR1cm4gZHZiX25ldF9mZWVkX3N0b3AoZGV2KTsKQEAgLTEyMjgsOCArMTI0NSw4IEBACiBzdGF0aWMgaW50IGR2Yl9uZXRfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKIHsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gKHN0cnVjdCBkdmJfZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZHZiX25ldCAqZHZibmV0ID0gKHN0cnVjdCBkdmJfbmV0ICopIGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkdmJfbmV0ICpkdmJuZXQgPSBkdmJkZXYtPnByaXY7CiAKIAlpZiAoKChmaWxlLT5mX2ZsYWdzJk9fQUNDTU9ERSk9PU9fUkRPTkxZKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTEyMzcsNyArMTI1NCw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE5FVF9BRERfSUY6CiAJewotCQlzdHJ1Y3QgZHZiX25ldF9pZiAqZHZibmV0aWY9KHN0cnVjdCBkdmJfbmV0X2lmICopcGFyZzsKKwkJc3RydWN0IGR2Yl9uZXRfaWYgKmR2Ym5ldGlmID0gcGFyZzsKIAkJaW50IHJlc3VsdDsKIAogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0xMjU4LDcgKzEyNzUsNyBAQAogCXsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAkJc3RydWN0IGR2Yl9uZXRfcHJpdiAqcHJpdl9kYXRhOwotCQlzdHJ1Y3QgZHZiX25ldF9pZiAqZHZibmV0aWY9KHN0cnVjdCBkdmJfbmV0X2lmICopcGFyZzsKKwkJc3RydWN0IGR2Yl9uZXRfaWYgKmR2Ym5ldGlmID0gcGFyZzsKIAogCQlpZiAoZHZibmV0aWYtPmlmX251bSA+PSBEVkJfTkVUX0RFVklDRVNfTUFYIHx8CiAJCSAgICAhZHZibmV0LT5zdGF0ZVtkdmJuZXRpZi0+aWZfbnVtXSkKQEAgLTEyNjYsNyArMTI4Myw3IEBACiAKIAkJbmV0ZGV2ID0gZHZibmV0LT5kZXZpY2VbZHZibmV0aWYtPmlmX251bV07CiAKLQkJcHJpdl9kYXRhPShzdHJ1Y3QgZHZiX25ldF9wcml2KiluZXRkZXYtPnByaXY7CisJCXByaXZfZGF0YSA9IG5ldGRldi0+cHJpdjsKIAkJZHZibmV0aWYtPnBpZD1wcml2X2RhdGEtPnBpZDsKIAkJZHZibmV0aWYtPmZlZWR0eXBlPXByaXZfZGF0YS0+ZmVlZHR5cGU7CiAJCWJyZWFrOwpAQCAtMTI4OCw3ICsxMzA1LDcgQEAKIAkvKiBiaW5hcnkgY29tcGF0aWJsaXR5IGNydWZ0ICovCiAJY2FzZSBfX05FVF9BRERfSUZfT0xEOgogCXsKLQkJc3RydWN0IF9fZHZiX25ldF9pZl9vbGQgKmR2Ym5ldGlmPShzdHJ1Y3QgX19kdmJfbmV0X2lmX29sZCAqKXBhcmc7CisJCXN0cnVjdCBfX2R2Yl9uZXRfaWZfb2xkICpkdmJuZXRpZiA9IHBhcmc7CiAJCWludCByZXN1bHQ7CiAKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtMTMwOSw3ICsxMzI2LDcgQEAKIAl7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXZfZGF0YTsKLQkJc3RydWN0IF9fZHZiX25ldF9pZl9vbGQgKmR2Ym5ldGlmPShzdHJ1Y3QgX19kdmJfbmV0X2lmX29sZCAqKXBhcmc7CisJCXN0cnVjdCBfX2R2Yl9uZXRfaWZfb2xkICpkdmJuZXRpZiA9IHBhcmc7CiAKIAkJaWYgKGR2Ym5ldGlmLT5pZl9udW0gPj0gRFZCX05FVF9ERVZJQ0VTX01BWCB8fAogCQkgICAgIWR2Ym5ldC0+c3RhdGVbZHZibmV0aWYtPmlmX251bV0pCkBAIC0xMzE3LDcgKzEzMzQsNyBAQAogCiAJCW5ldGRldiA9IGR2Ym5ldC0+ZGV2aWNlW2R2Ym5ldGlmLT5pZl9udW1dOwogCi0JCXByaXZfZGF0YT0oc3RydWN0IGR2Yl9uZXRfcHJpdiopbmV0ZGV2LT5wcml2OworCQlwcml2X2RhdGEgPSBuZXRkZXYtPnByaXY7CiAJCWR2Ym5ldGlmLT5waWQ9cHJpdl9kYXRhLT5waWQ7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKaW5kZXggY2Y0ZmZlMy4uOWQ5NjYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKQEAgLTI4Niw5ICsyODYsOCBAQAogfQogCiAKLWludCBkdmJfcmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgZHZiX2FkYXB0ZXIgKipwYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQoraW50IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQogewotCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcDsKIAlpbnQgbnVtOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRldl9yZWdpc3Rlcl9sb2NrKSkKQEAgLTI5OSwxMSArMjk4LDYgQEAKIAkJcmV0dXJuIC1FTkZJTEU7CiAJfQogCi0JaWYgKCEoKnBhZGFwID0gYWRhcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfYWRhcHRlciksIEdGUF9LRVJORUwpKSkgewotCQl1cCgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAltZW1zZXQgKGFkYXAsIDAsIHNpemVvZihzdHJ1Y3QgZHZiX2FkYXB0ZXIpKTsKIAlJTklUX0xJU1RfSEVBRCAoJmFkYXAtPmRldmljZV9saXN0KTsKIApAQCAtMzMxLDcgKzMyNSw2IEBACiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJbGlzdF9kZWwgKCZhZGFwLT5saXN0X2hlYWQpOwogCXVwICgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOwotCWtmcmVlIChhZGFwKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHZiX3VucmVnaXN0ZXJfYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCmluZGV4IDE4NGVkYmEuLmEyNTE4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCkBAIC03Niw3ICs3Niw3IEBACiB9OwogCiAKLWV4dGVybiBpbnQgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgKHN0cnVjdCBkdmJfYWRhcHRlciAqKnBhZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOworZXh0ZXJuIGludCBkdmJfcmVnaXN0ZXJfYWRhcHRlciAoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwogZXh0ZXJuIGludCBkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyIChzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFkYXApOwogCiBleHRlcm4gaW50IGR2Yl9yZWdpc3Rlcl9kZXZpY2UgKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggMGJmZDRkZi4uNzVmYjU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTEyLDEwICsxMiwxMCBAQAogCiBjb25maWcgRFZCX0NYMjQxMTAKIAl0cmlzdGF0ZSAiQ29uZXhhbnQgQ1gyNDExMCBiYXNlZCIKLSAJZGVwZW5kcyBvbiBEVkJfQ09SRQotIAloZWxwCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWhlbHAKIAkgIEEgRFZCLVMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KLSAKKwogY29uZmlnIERWQl9UREE4MDgzCiAJdHJpc3RhdGUgIlBoaWxpcHMgVERBODA4MyBiYXNlZCIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCkBAIC0xMjcsOCArMTI3LDggQEAKIGNvbmZpZyBEVkJfQVRNRUxfQVQ3NkM2NTEKIAl0cmlzdGF0ZSAiQXRtZWwgQVQ3NkM2NTEgYmFzZWQiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQotICAgICAgICBoZWxwCi0gCSAgQSBEVkItQyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCWhlbHAKKwkgIEEgRFZCLUMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAogY29uZmlnIERWQl9WRVMxODIwCiAJdHJpc3RhdGUgIlZMU0kgVkVTMTgyMCBiYXNlZCIKQEAgLTE1OCwxMCArMTU4LDYgQEAKIAloZWxwCiAJICBBbiBBVFNDIDhWU0IgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAotY29uZmlnIERWQl9PUjUxMTMyCi0JdHJpc3RhdGUgIk9SNTExMzIgYmFzZWQgKHBjSERUVikiCi0JZGVwZW5kcyBvbiBEVkJfQ09SRQotCiBjb25maWcgRFZCX09SNTEyMTEKIAl0cmlzdGF0ZSAib3I1MTIxMSBiYXNlZCAocGNIRFRWIEhEMjAwMCBjYXJkKSIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCkBAIC0xNjksNCArMTY1LDEyIEBACiAJaGVscAogCSAgQW4gQVRTQyA4VlNCIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfT1I1MTEzMgorCXRyaXN0YXRlICJPUjUxMTMyIGJhc2VkIChwY0hEVFYgSEQzMDAwIGNhcmQpIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwlzZWxlY3QgRldfTE9BREVSCisJaGVscAorCSAgQW4gQVRTQyA4VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50CisJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdDc2YzY1MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0NzZjNjUxLmMKaW5kZXggY2UyZWFhMS4uNzJhMmI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0NzZjNjUxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0NzZjNjUxLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCQkJCSAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhdDc2YzY1MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGF0NzZjNjUxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJYXQ3NmM2NTFfd3JpdGVyZWcoc3RhdGUsIDB4MGMsIDB4YzMpOwogCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKIHN0YXRpYyBpbnQgYXQ3NmM2NTFfc2V0X2RlZmF1bHRzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBhdDc2YzY1MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGF0NzZjNjUxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJYXQ3NmM2NTFfc2V0X3N5bWJvbF9yYXRlKHN0YXRlLCA2OTAwMDAwKTsKIAlhdDc2YzY1MV9zZXRfcWFtKHN0YXRlLCBRQU1fNjQpOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAKIHN0YXRpYyBpbnQgYXQ3NmM2NTFfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCiB7Ci0Jc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggc3luYzsKIAogCS8qCkBAIC0zMTksNyArMzE5LDcgQEAKIAogc3RhdGljIGludCBhdDc2YzY1MV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqYmVyID0gKGF0NzZjNjUxX3JlYWRyZWcoc3RhdGUsIDB4ODEpICYgMHgwRikgPDwgMTY7CiAJKmJlciB8PSBhdDc2YzY1MV9yZWFkcmVnKHN0YXRlLCAweDgyKSA8PCA4OwpAQCAtMzMxLDcgKzMzMSw3IEBACiAKIHN0YXRpYyBpbnQgYXQ3NmM2NTFfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1OCBnYWluID0gfmF0NzZjNjUxX3JlYWRyZWcoc3RhdGUsIDB4OTEpOwogCSpzdHJlbmd0aCA9IChnYWluIDw8IDgpIHwgZ2FpbjsKQEAgLTM0MSw3ICszNDEsNyBAQAogCiBzdGF0aWMgaW50IGF0NzZjNjUxX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBhdDc2YzY1MV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBhdDc2YzY1MV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSpzbnIgPSAweEZGRkYgLQogCSAgICAoKGF0NzZjNjUxX3JlYWRyZWcoc3RhdGUsIDB4OEYpIDw8IDgpIHwKQEAgLTM1Miw3ICszNTIsNyBAQAogCiBzdGF0aWMgaW50IGF0NzZjNjUxX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCiB7Ci0Jc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqdWNibG9ja3MgPSBhdDc2YzY1MV9yZWFkcmVnKHN0YXRlLCAweDgyKTsKIApAQCAtMzY5LDcgKzM2OSw3IEBACiAKIHN0YXRpYyB2b2lkIGF0NzZjNjUxX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGF0NzZjNjUxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC0zODEsNyArMzgxLDcgQEAKIAlzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGF0NzZjNjUxX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0NzZjNjUxX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXQ3NmM2NTFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmMKaW5kZXggYTIxMjI3OS4uMGMyZWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAogc3RhdGljIGludCBjeDIyNzAwX2luaXQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogCi17CXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworewlzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgaTsKIAogCWRwcmludGsoImN4MjI3MDBfaW5pdDogaW5pdCBjaGlwXG4iKTsKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCiB7Ci0Jc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBjeDIyNzAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1MTYgcnNfYmVyID0gKGN4MjI3MDBfcmVhZHJlZyAoc3RhdGUsIDB4MGQpIDw8IDkpCiAJCSAgIHwgKGN4MjI3MDBfcmVhZHJlZyAoc3RhdGUsIDB4MGUpIDw8IDEpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAKIHN0YXRpYyBpbnQgY3gyMjcwMF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBjeDIyNzAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqYmVyID0gY3gyMjcwMF9yZWFkcmVnIChzdGF0ZSwgMHgwYykgJiAweDdmOwogCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDBjLCAweDAwKTsKQEAgLTI5Niw3ICsyOTYsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc2lnbmFsX3N0cmVuZ3RoKQogewotCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTE2IHJzX2JlciA9IChjeDIyNzAwX3JlYWRyZWcgKHN0YXRlLCAweDBkKSA8PCA5KQogCQkgICB8IChjeDIyNzAwX3JlYWRyZWcgKHN0YXRlLCAweDBlKSA8PCAxKTsKQEAgLTMwNyw3ICszMDcsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDBfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTE2IHJzX2JlciA9IChjeDIyNzAwX3JlYWRyZWcgKHN0YXRlLCAweDBkKSA8PCA5KQogCQkgICB8IChjeDIyNzAwX3JlYWRyZWcgKHN0YXRlLCAweDBlKSA8PCAxKTsKQEAgLTMxOCw3ICszMTgsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKIHsKLQlzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjI3MDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSp1Y2Jsb2NrcyA9IGN4MjI3MDBfcmVhZHJlZyAoc3RhdGUsIDB4MGYpOwogCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDBmLCAweDAwKTsKQEAgLTMyOCw3ICszMjgsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBjeDIyNzAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMik7IC8qIFhYWCBDSEVDS01FOiBzb2Z0IHJlc2V0Ki8KIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMCk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogc3RhdGljIGludCBjeDIyNzAwX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHJlZzA5ID0gY3gyMjcwMF9yZWFkcmVnIChzdGF0ZSwgMHgwOSk7CiAKIAlwLT5pbnZlcnNpb24gPSByZWcwOSAmIDB4MSA/IElOVkVSU0lPTl9PTiA6IElOVkVSU0lPTl9PRkY7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAogc3RhdGljIHZvaWQgY3gyMjcwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtMzc1LDcgKzM3NSw3IEBACiAJc3RydWN0IGN4MjI3MDBfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGN4MjI3MDBfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3gyMjcwMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjI3MDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKaW5kZXggMDExODYwYy4uZjRhYTQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIHN0YXRpYyBpbnQgY3gyMjcwMl9zZXRfdHBzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXU4IHZhbDsKLQlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjI3MDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCS8qIHNldCBQTEwgKi8KICAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CkBAIC0zMzgsNyArMzM4LDcgQEAKIHN0YXRpYyBpbnQgY3gyMjcwMl9pbml0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlpbnQgaTsKLQlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjI3MDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDAwLCAweDAyKTsKIApAQCAtMzYwLDcgKzM2MCw3IEBACiAKIHN0YXRpYyBpbnQgY3gyMjcwMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjI3MDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCByZWcwQTsKIAl1OCByZWcyMzsKIApAQCAtMzg5LDcgKzM4OSw3IEBACiAKIHN0YXRpYyBpbnQgY3gyMjcwMl9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBjeDIyNzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlpZihjeDIyNzAyX3JlYWRyZWcgKHN0YXRlLCAweEU0KSAmIDB4MDIpIHsKIAkJLyogUmVhbHRpbWUgc3RhdGlzdGljcyAqLwpAQCAtNDA2LDcgKzQwNiw3IEBACiAKIHN0YXRpYyBpbnQgY3gyMjcwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzaWduYWxfc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBjeDIyNzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqc2lnbmFsX3N0cmVuZ3RoID0gY3gyMjcwMl9yZWFkcmVnIChzdGF0ZSwgMHgyMyk7CiAKQEAgLTQxNSw3ICs0MTUsNyBAQAogCiBzdGF0aWMgaW50IGN4MjI3MDJfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTE2IHJzX2Jlcj0wOwogCWlmKGN4MjI3MDJfcmVhZHJlZyAoc3RhdGUsIDB4RTQpICYgMHgwMikgewpAQCAtNDM0LDcgKzQzNCw3IEBACiAKIHN0YXRpYyBpbnQgY3gyMjcwMl9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggX3VjYmxvY2tzOwogCkBAIC00NDksNyArNDQ5LDcgQEAKIAogc3RhdGljIGludCBjeDIyNzAyX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggcmVnMEMgPSBjeDIyNzAyX3JlYWRyZWcgKHN0YXRlLCAweDBDKTsKIApAQCAtNDU5LDcgKzQ1OSw3IEBACiAKIHN0YXRpYyB2b2lkIGN4MjI3MDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjI3MDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCXN0cnVjdCBjeDIyNzAyX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCBjeDIyNzAyX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjI3MDJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDIyNzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCmluZGV4IGFlMTYxMTIuLjgyMjJiODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYwpAQCAtMzE1LDcgKzMxNSw3IEBACiAKIGludCBjeDI0MTEwX3BsbF93cml0ZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBkYXRhKQogewotCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgY3gyNDExMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAvKiB0dW5lciBkYXRhIGlzIDIxIGJpdHMgbG9uZywgbXVzdCBiZSBsZWZ0LWFsaWduZWQgaW4gZGF0YSAqLwogLyogdHVuZXIgY3gyNDEwOCBpcyB3cml0dGVuIHRocm91Z2ggYSBkZWRpY2F0ZWQgM3dpcmUgaW50ZXJmYWNlIG9uIHRoZSBkZW1vZCBjaGlwICovCkBAIC0zNTYsNyArMzU2LDcgQEAKIAogc3RhdGljIGludCBjeDI0MTEwX2luaXRmZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIC8qIGZpeG1lIChsb3cpOiBlcnJvciBoYW5kbGluZyAqLwogICAgICAgICBpbnQgaTsKIApAQCAtMzczLDcgKzM3Myw3IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN3aXRjaCAodm9sdGFnZSkgewogCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CkBAIC0zODUsOCArMzg1LDcgQEAKIAl9OwogfQogCi1zdGF0aWMgaW50IGN4MjQxMTBfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQlmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3N0YXRpYyBpbnQgY3gyNDExMF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpCiB7CiAJaW50IHJ2LCBiaXQsIGk7CiAJc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC00MTMsNyArNDEyLDcgQEAKIAkJCQkgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICpjbWQpCiB7CiAJaW50IGksIHJ2OwotCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgY3gyNDExMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZm9yIChpID0gMDsgaSA8IGNtZC0+bXNnX2xlbjsgaSsrKQogCQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc5ICsgaSwgY21kLT5tc2dbaV0pOwpAQCAtNDMyLDcgKzQzMSw3IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWludCBzeW5jID0gY3gyNDExMF9yZWFkcmVnIChzdGF0ZSwgMHg1NSk7CiAKQEAgLTQ2MCw3ICs0NTksNyBAQAogCiBzdGF0aWMgaW50IGN4MjQxMTBfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKQogewotCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgY3gyNDExMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJLyogZml4bWUgKG1heWJlKTogdmFsdWUgcmFuZ2UgaXMgMTYgYml0LiBTY2FsZT8gKi8KIAlpZihjeDI0MTEwX3JlYWRyZWcoc3RhdGUsMHgyNCkmMHgxMCkgewpAQCAtNDc4LDcgKzQ3Nyw3IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzaWduYWxfc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBjeDI0MTEwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIC8qIG5vIHByb3Zpc2lvbiBpbiBoYXJkd2FyZS4gUmVhZCB0aGUgZnJvbnRlbmQgQUdDIGFjY3VtdWxhdG9yLiBObyBpZGVhIGhvdyB0byBzY2FsZSB0aGlzLCBidXQgSSBrbm93IGl0IGlzIDJzIGNvbXBsZW1lbnQgKi8KIAl1OCBzaWduYWwgPSBjeDI0MTEwX3JlYWRyZWcgKHN0YXRlLCAweDI3KSsxMjg7CkBAIC00ODksNyArNDg4LDcgQEAKIAogc3RhdGljIGludCBjeDI0MTEwX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCS8qIG5vIHByb3Zpc2lvbiBpbiBoYXJkd2FyZS4gQ2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlIEVzL04wIGVzdGltYXRvciwgYnV0IEkgZG9uJ3Qga25vdyBob3cuICovCiAJaWYoY3gyNDExMF9yZWFkcmVnKHN0YXRlLDB4NmEpJjB4ODApIHsKQEAgLTUwNSw3ICs1MDQsNyBAQAogCiBzdGF0aWMgaW50IGN4MjQxMTBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MzIgbGFzdGJ5ZXI7CiAKIAlpZihjeDI0MTEwX3JlYWRyZWcoc3RhdGUsMHgxMCkmMHg0MCkgewpAQCAtNTI3LDcgKzUyNiw3IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwogCWN4MjQxMTBfc2V0X2ludmVyc2lvbiAoc3RhdGUsIHAtPmludmVyc2lvbik7CkBAIC01NDAsNyArNTM5LDcgQEAKIAogc3RhdGljIGludCBjeDI0MTEwX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgY3gyNDExMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXMzMiBhZmM7IHVuc2lnbmVkIHNjbGs7CiAKIC8qIGNhbm5vdCByZWFkIGJhY2sgdHVuZXIgc2V0dGluZ3MgKGZyZXEpLiBOZWVkIHRvIGhhdmUgc29tZSBwcml2YXRlIHN0b3JhZ2UgKi8KQEAgLTU2NywxNCArNTY2LDE0IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCiB7Ci0Jc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBjeDI0MTEwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlyZXR1cm4gY3gyNDExMF93cml0ZXJlZyhzdGF0ZSwweDc2LChjeDI0MTEwX3JlYWRyZWcoc3RhdGUsMHg3NikmfjB4MTApfCgoKHRvbmU9PVNFQ19UT05FX09OKSk/MHgxMDowKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGN4MjQxMTBfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGN4MjQxMTBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTU4Nyw3ICs1ODYsNyBAQAogCWludCByZXQ7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCBjeDI0MTEwX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjQxMTBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDI0MTEwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwppbmRleCBhODUzZDEyLi42ZjUyZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCkBAIC01NiwxMiArNTYsMTIgQEAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwLCBpbnQgdHVuZXIpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKm9mZG0gPSAmZmVwLT51Lm9mZG07CiAJZmVfY29kZV9yYXRlX3QgZmVfY3IgPSBGRUNfTk9ORTsKIAlpbnQgc2VhcmNoX3N0YXRlLCBzZXE7CiAKLQlpZiAodHVuZXIpIHsKKwlpZiAodHVuZXIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfYWRkciAmJiBzdGF0ZS0+Y29uZmlnLnBsbF9zZXQpIHsKIAkJZGliMzAwMG1iX3R1bmVyX3Bhc3NfY3RybChmZSwxLHN0YXRlLT5jb25maWcucGxsX2FkZHIoZmUpKTsKIAkJc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLCBmZXAsIE5VTEwpOwogCQlkaWIzMDAwbWJfdHVuZXJfcGFzc19jdHJsKGZlLDAsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX2ZlX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBtb2JpbGVfbW9kZSkKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWRlYl9pbmZvKCJkaWIzMDAwbWIgaXMgZ2V0dGluZyB1cC5cbiIpOwogCXdyKERJQjMwMDBNQl9SRUdfUE9XRVJfQ09OVFJPTCwgRElCMzAwME1CX1BPV0VSX1VQKTsKQEAgLTQwMSw3ICs0MDEsNyBAQAogc3RhdGljIGludCBkaWIzMDAwbWJfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKm9mZG0gPSAmZmVwLT51Lm9mZG07CiAJZmVfY29kZV9yYXRlX3QgKmNyOwogCXUxNiB0cHNfdmFsOwpAQCAtNTYyLDcgKzU2Miw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCAqc3RhdCkKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSpzdGF0ID0gMDsKIApAQCAtNTk0LDcgKzU5NCw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKmJlcikKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSpiZXIgPSAoKHJkKERJQjMwMDBNQl9SRUdfQkVSX01TQikgPDwgMTYpIHwgcmQoRElCMzAwME1CX1JFR19CRVJfTFNCKSk7CiAJcmV0dXJuIDA7CkBAIC02MDMsNyArNjAzLDcgQEAKIC8qIHNlZSBkaWIzMDAwLXdhdGNoIGR2Yi1hcHBzIGZvciBleGFjdCBjYWxjdWF0aW9ucyBvZiBzaWduYWxfc3RyZW5ndGggYW5kIHNuciAqLwogc3RhdGljIGludCBkaWIzMDAwbWJfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiAqc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqc3RyZW5ndGggPSByZChESUIzMDAwTUJfUkVHX1NJR05BTF9QT1dFUikgKiAweGZmZmYgLyAweDE3MDsKIAlyZXR1cm4gMDsKQEAgLTYxMSw3ICs2MTEsNyBAQAogCiBzdGF0aWMgaW50IGRpYjMwMDBtYl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJc2hvcnQgc2lncG93ID0gcmQoRElCMzAwME1CX1JFR19TSUdOQUxfUE9XRVIpOwogCWludCBpY2lwb3cgPSAoKHJkKERJQjMwMDBNQl9SRUdfTk9JU0VfUE9XRVJfTVNCKSAmIDB4ZmYpIDw8IDE2KSB8CiAJCXJkKERJQjMwMDBNQl9SRUdfTk9JU0VfUE9XRVJfTFNCKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogCiBzdGF0aWMgaW50IGRpYjMwMDBtYl9yZWFkX3VuY19ibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqdW5jKQogewotCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnVuYyA9IHJkKERJQjMwMDBNQl9SRUdfVU5DKTsKIAlyZXR1cm4gMDsKQEAgLTYyOSw3ICs2MjksNyBAQAogCiBzdGF0aWMgaW50IGRpYjMwMDBtYl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlkZWJfaW5mbygiZGliMzAwMG1iIGlzIGdvaW5nIHRvIGJlZC5cbiIpOwogCXdyKERJQjMwMDBNQl9SRUdfUE9XRVJfQ09OVFJPTCwgRElCMzAwME1CX1BPV0VSX0RPV04pOwogCXJldHVybiAwOwpAQCAtNjU2LDcgKzY1Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRpYjMwMDBtYl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBkaWIzMDAwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWIzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtNjcxLDcgKzY3MSw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX2ZpZm9fY29udHJvbChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmKQogewotCXN0cnVjdCBkaWIzMDAwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWIzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZGViX3hmZXIoIiVzIGZpZm9cbiIsb25vZmYgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwogCWlmIChvbm9mZikgewpAQCAtNjkyLDcgKzY5Miw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1iX3R1bmVyX3Bhc3NfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmLCB1OCBwbGxfYWRkcikKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpZiAob25vZmYpIHsKIAkJd3IoRElCMzAwME1CX1JFR19UVU5FUiwgRElCMzAwMF9UVU5FUl9XUklURV9FTkFCTEUocGxsX2FkZHIpKTsKIAl9IGVsc2UgewpAQCAtNzA5LDcgKzcwOSw3IEBACiAJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGliMzAwMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpYjMwMDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKIAltZW1zZXQoc3RhdGUsMCxzaXplb2Yoc3RydWN0IGRpYjMwMDBfc3RhdGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwppbmRleCA0YTMxYzA1Li44ODhmMTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIHN0YXRpYyBpbnQgZGliMzAwMG1jX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQogewotCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpvZmRtID0gJmZlcC0+dS5vZmRtOwogCWZlX2NvZGVfcmF0ZV90ICpjcjsKIAl1MTYgdHBzX3ZhbCxjcl92YWw7CkBAIC00NTgsMTIgKzQ1OCwxMiBAQAogc3RhdGljIGludCBkaWIzMDAwbWNfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXAsIGludCB0dW5lcikKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyAqb2ZkbSA9ICZmZXAtPnUub2ZkbTsKIAlpbnQgc2VhcmNoX3N0YXRlLGF1dG9fdmFsOwogCXUxNiB2YWw7CiAKLQlpZiAodHVuZXIpIHsgLyogaW5pdGlhbCBjYWxsIGZyb20gZHZiICovCisJaWYgKHR1bmVyICYmIHN0YXRlLT5jb25maWcucGxsX2FkZHIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfc2V0KSB7IC8qIGluaXRpYWwgY2FsbCBmcm9tIGR2YiAqLwogCQlkaWIzMDAwbWNfdHVuZXJfcGFzc19jdHJsKGZlLDEsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwogCQlzdGF0ZS0+Y29uZmlnLnBsbF9zZXQoZmUsZmVwLE5VTEwpOwogCQlkaWIzMDAwbWNfdHVuZXJfcGFzc19jdHJsKGZlLDAsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwpAQCAtNjU5LDcgKzY1OSw3IEBACiB9CiBzdGF0aWMgaW50IGRpYjMwMDBtY19yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QgKnN0YXQpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2IGxvY2sgPSByZChESUIzMDAwTUNfUkVHX0xPQ0tJTkcpOwogCiAJKnN0YXQgPSAwOwpAQCAtNjc5LDE0ICs2NzksMTQgQEAKIAogc3RhdGljIGludCBkaWIzMDAwbWNfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqYmVyKQogewotCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCSpiZXIgPSAoKHJkKERJQjMwMDBNQ19SRUdfQkVSX01TQikgPDwgMTYpIHwgcmQoRElCMzAwME1DX1JFR19CRVJfTFNCKSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliMzAwMG1jX3JlYWRfdW5jX2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICp1bmMpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqdW5jID0gcmQoRElCMzAwME1DX1JFR19QQUNLRVRfRVJST1JfQ09VTlQpOwogCXJldHVybiAwOwpAQCAtNjk1LDcgKzY5NSw3IEBACiAvKiBzZWUgZGliMzAwMG1iLmMgZm9yIGNhbGN1bGF0aW9uIGNvbW1lbnRzICovCiBzdGF0aWMgaW50IGRpYjMwMDBtY19yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzdHJlbmd0aCkKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MTYgdmFsID0gcmQoRElCMzAwME1DX1JFR19TSUdOQUxfTk9JU0VfTFNCKTsKIAkqc3RyZW5ndGggPSAoKCh2YWwgPj4gNikgJiAweGZmKSA8PCA4KSArICh2YWwgJiAweDNmKTsKIApAQCAtNzA2LDcgKzcwNiw3IEBACiAvKiBzZWUgZGliMzAwMG1iLmMgZm9yIGNhbGN1bGF0aW9uIGNvbW1lbnRzICovCiBzdGF0aWMgaW50IGRpYjMwMDBtY19yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2IHZhbCA9IHJkKERJQjMwMDBNQ19SRUdfU0lHTkFMX05PSVNFX0xTQiksCiAJCXZhbDIgPSByZChESUIzMDAwTUNfUkVHX1NJR05BTF9OT0lTRV9NU0IpOwogCXUxNiBzaWcsbm9pc2U7CkBAIC03MjYsNyArNzI2LDcgQEAKIAogc3RhdGljIGludCBkaWIzMDAwbWNfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzZXRfb3IoRElCMzAwME1DX1JFR19DTEtfQ0ZHXzcsRElCMzAwME1DX0NMS19DRkdfN19QV1JfRE9XTik7CiAJd3IoRElCMzAwME1DX1JFR19DTEtfQ0ZHXzEsRElCMzAwME1DX0NMS19DRkdfMV9QT1dFUl9ET1dOKTsKQEAgLTc1Niw3ICs3NTYsNyBAQAogCiBzdGF0aWMgdm9pZCBkaWIzMDAwbWNfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUgKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC03NzEsNyArNzcxLDcgQEAKIAogc3RhdGljIGludCBkaWIzMDAwbWNfZmlmb19jb250cm9sKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgb25vZmYpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBkaWIzMDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYjMwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2IHRtcCA9IHJkKERJQjMwMDBNQ19SRUdfU01PX01PREUpOwogCiAJZGViX3hmZXIoIiVzIGZpZm9cbiIsb25vZmYgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwpAQCAtODAzLDcgKzgwMyw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1jX3R1bmVyX3Bhc3NfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmLCB1OCBwbGxfYWRkcikKIHsKLQlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGRpYjMwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGliMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpZiAob25vZmYpIHsKIAkJd3IoRElCMzAwME1DX1JFR19UVU5FUiwgRElCMzAwMF9UVU5FUl9XUklURV9FTkFCTEUocGxsX2FkZHIpKTsKIAl9IGVsc2UgewpAQCAtODQ0LDcgKzg0NCw3IEBACiAJdTE2IGRldmlkOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgZGliMzAwMF9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGliMzAwMF9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKQogCQlnb3RvIGVycm9yOwogCW1lbXNldChzdGF0ZSwwLHNpemVvZihzdHJ1Y3QgZGliMzAwMF9zdGF0ZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKaW5kZXggMDE2Yzc5NC4uYzRjM2M1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCkBAIC0yLDYgKzIsOSBAQAogICogJElkOiBkdmItcGxsLmgsdiAxLjIgMjAwNS8wMi8xMCAxMTo0Mzo0MSBrcmF4ZWwgRXhwICQKICAqLwogCisjaWZuZGVmIF9fRFZCX1BMTF9IX18KKyNkZWZpbmUgX19EVkJfUExMX0hfXworCiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIHsKIAljaGFyICpuYW1lOwogCXUzMiAgbWluOwpAQCAtMjYsOSArMjksNCBAQAogaW50IGR2Yl9wbGxfY29uZmlndXJlKHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MsIHU4ICpidWYsCiAJCSAgICAgIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKTsKIAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIERWQj0xIgotICogRW5kOgotICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYwppbmRleCBjMDVhOWIwLi5jZmY5M2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiX2R1bW15X2ZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yl9kdW1teV9mZS5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogc3RhdGljIHZvaWQgZHZiX2R1bW15X2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC0xMTEsNyArMTExLDcgQEAKIAlzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KQEAgLTEzNCw3ICsxMzQsNyBAQAogCXN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKaW5kZXggOWFjOTVkZS4uMDMxYTFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIHN0YXRpYyBpbnQgYXBwbHlfZnJvbnRlbmRfcGFyYW0gKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQogewotCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsNjQ3ODFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCS8qIFRoZSBjb2RlcmF0ZXMgZm9yIEZFQ19OT05FLCBGRUNfNF81IGFuZCBGRUNfRkVDXzZfNyBhcmUgYXJiaXRyYXJ5ICovCiAJc3RhdGljIGNvbnN0IHU4IGZlY190YWJbXSA9IHsgNywgMCwgMSwgMiwgOSwgMywgMTAsIDQgfTsKIAkvKiBRUFNLLCBRQU1fMTYsIFFBTV82NCAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAKIHN0YXRpYyBpbnQgZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtKQogewotCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsNjQ3ODFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCB0bXA7CiAKIApAQCAtMzUyLDcgKzM1Miw3IEBACiAKIHN0YXRpYyBpbnQgbDY0NzgxX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewotCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsNjQ3ODFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBzeW5jID0gbDY0NzgxX3JlYWRyZWcgKHN0YXRlLCAweDMyKTsKIAlpbnQgZ2FpbiA9IGw2NDc4MV9yZWFkcmVnIChzdGF0ZSwgMHgwZSk7CiAKQEAgLTM4MSw3ICszODEsNyBAQAogCiBzdGF0aWMgaW50IGw2NDc4MV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IGw2NDc4MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGw2NDc4MV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiAgIFhYWCBGSVhNRTogc2V0IHVwIGNvdW50aW5nIHBlcmlvZCAocmVnIDB4MjYuLi4weDI4KQogCSAqLwpAQCAtMzkzLDcgKzM5Myw3IEBACiAKIHN0YXRpYyBpbnQgbDY0NzgxX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNpZ25hbF9zdHJlbmd0aCkKIHsKLQlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgbDY0NzgxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGw2NDc4MV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IGdhaW4gPSBsNjQ3ODFfcmVhZHJlZyAoc3RhdGUsIDB4MGUpOwogCSpzaWduYWxfc3RyZW5ndGggPSAoZ2FpbiA8PCA4KSB8IGdhaW47CkBAIC00MDMsNyArNDAzLDcgQEAKIAogc3RhdGljIGludCBsNjQ3ODFfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsNjQ3ODFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggYXZnX3F1YWxpdHkgPSAweGZmIC0gbDY0NzgxX3JlYWRyZWcgKHN0YXRlLCAweDMzKTsKIAkqc25yID0gKGF2Z19xdWFsaXR5IDw8IDgpIHwgYXZnX3F1YWxpdHk7IC8qIG5vdCBleGFjdCwgYnV0Li4uKi8KQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBzdGF0aWMgaW50IGw2NDc4MV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsNjQ3ODFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbDY0NzgxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnVjYmxvY2tzID0gbDY0NzgxX3JlYWRyZWcgKHN0YXRlLCAweDM3KQogCSAgIHwgKGw2NDc4MV9yZWFkcmVnIChzdGF0ZSwgMHgzOCkgPDwgOCk7CkBAIC00MjMsNyArNDIzLDcgQEAKIAogc3RhdGljIGludCBsNjQ3ODFfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGw2NDc4MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGw2NDc4MV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiBQb3dlciBkb3duICovCiAJcmV0dXJuIGw2NDc4MV93cml0ZXJlZyAoc3RhdGUsIDB4M2UsIDB4NWEpOwpAQCAtNDMxLDcgKzQzMSw3IEBACiAKIHN0YXRpYyBpbnQgbDY0NzgxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGw2NDc4MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGw2NDc4MV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKICAgICAgICAgcmVzZXRfYW5kX2NvbmZpZ3VyZSAoc3RhdGUpOwogCkBAIC00ODQsNyArNDg0LDcgQEAKIAogc3RhdGljIHZvaWQgbDY0NzgxX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IGw2NDc4MV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGw2NDc4MV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBsNjQ3ODFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC01MDEsNyArNTAxLDcgQEAKIAkJCSAgIHsgLmFkZHIgPSBjb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0gfTsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGw2NDc4MV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsNjQ3ODFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsNjQ3ODFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwppbmRleCAxNzZhMjJlLi5lNDU1YWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAKIHN0YXRpYyBpbnQgbXQzMTJfaW5pdGZlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IG10MzEyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXQ7CiAJdTggYnVmWzJdOwogCkBAIC0yODcsNyArMjg3LDcgQEAKIHN0YXRpYyBpbnQgbXQzMTJfc2VuZF9tYXN0ZXJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCSBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICpjKQogewotCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IG10MzEyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXQ7CiAJdTggZGlzZXFjX21vZGU7CiAKQEAgLTMxOCw3ICszMTgsNyBAQAogCiBzdGF0aWMgaW50IG10MzEyX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IGZlX3NlY19taW5pX2NtZF90IGMpCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJY29uc3QgdTggbWluaV90YWJbMl0gPSB7IDB4MDIsIDB4MDMgfTsKIAogCWludCByZXQ7CkBAIC0zNDAsNyArMzQwLDcgQEAKIAogc3RhdGljIGludCBtdDMxMl9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3QgZmVfc2VjX3RvbmVfbW9kZV90IHQpCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJY29uc3QgdTggdG9uZV90YWJbMl0gPSB7IDB4MDEsIDB4MDAgfTsKIAogCWludCByZXQ7CkBAIC0zNjIsNyArMzYyLDcgQEAKIAogc3RhdGljIGludCBtdDMxMl9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3QgZmVfc2VjX3ZvbHRhZ2VfdCB2KQogewotCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IG10MzEyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWNvbnN0IHU4IHZvbHRfdGFiWzNdID0geyAweDAwLCAweDQwLCAweDAwIH07CiAKIAlpZiAodiA+IFNFQ19WT0xUQUdFX09GRikKQEAgLTM3Myw3ICszNzMsNyBAQAogCiBzdGF0aWMgaW50IG10MzEyX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCAqcykKIHsKLQlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBtdDMxMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmV0OwogCXU4IHN0YXR1c1szXTsKIApAQCAtNDAwLDcgKzQwMCw3IEBACiAKIHN0YXRpYyBpbnQgbXQzMTJfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqYmVyKQogewotCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IG10MzEyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXQ7CiAJdTggYnVmWzNdOwogCkBAIC00MTQsNyArNDE0LDcgQEAKIAogc3RhdGljIGludCBtdDMxMl9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzaWduYWxfc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1OCBidWZbM107CiAJdTE2IGFnYzsKQEAgLTQzNSw3ICs0MzUsNyBAQAogCiBzdGF0aWMgaW50IG10MzEyX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnNucikKIHsKLQlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBtdDMxMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmV0OwogCXU4IGJ1ZlsyXTsKIApAQCAtNDQ5LDcgKzQ0OSw3IEBACiAKIHN0YXRpYyBpbnQgbXQzMTJfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICp1YmMpCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1OCBidWZbMl07CiAKQEAgLTQ2NCw3ICs0NjQsNyBAQAogc3RhdGljIGludCBtdDMxMl9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1OCBidWZbNV0sIGNvbmZpZ192YWw7CiAJdTE2IHNyOwpAQCAtNTYwLDcgKzU2MCw3IEBACiBzdGF0aWMgaW50IG10MzEyX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBtdDMxMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBtdDMxMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmV0OwogCiAJaWYgKChyZXQgPSBtdDMxMl9nZXRfaW52ZXJzaW9uKHN0YXRlLCAmcC0+aW52ZXJzaW9uKSkgPCAwKQpAQCAtNTc3LDcgKzU3Nyw3IEBACiAKIHN0YXRpYyBpbnQgbXQzMTJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgbXQzMTJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1OCBjb25maWc7CiAKQEAgLTYwNSw3ICs2MDUsNyBAQAogCiBzdGF0aWMgdm9pZCBtdDMxMl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBtdDMxMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG10MzEyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG10MzEyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtNjE3LDcgKzYxNyw3IEBACiAJc3RydWN0IG10MzEyX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCBtdDMxMl9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDMxMl9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10MzEyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTY1MSw3ICs2NTEsNyBAQAogCXN0cnVjdCBtdDMxMl9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgbXQzMTJfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXQzMTJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDMxMl9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKQogCQlnb3RvIGVycm9yOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCmluZGV4IDUwMzI2YzcuLmQzMmRjNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCkBAIC00Niw3ICs0Niw3IEBACiAJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwotCWNvbnN0IHN0cnVjdCBtdDM1Ml9jb25maWcqIGNvbmZpZzsKKwlzdHJ1Y3QgbXQzNTJfY29uZmlnIGNvbmZpZzsKIH07CiAKIHN0YXRpYyBpbnQgZGVidWc7CkBAIC01OSw3ICs1OSw3IEBACiB7CiAJc3RydWN0IG10MzUyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IGJ1ZlsyXSA9IHsgcmVnLCB2YWwgfTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLAogCQkJICAgICAgIC5idWYgPSBidWYsIC5sZW4gPSAyIH07CiAJaW50IGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKIAlpZiAoZXJyICE9IDEpIHsKQEAgLTg0LDEwICs4NCwxMCBAQAogCWludCByZXQ7CiAJdTggYjAgW10gPSB7IHJlZyB9OwogCXU4IGIxIFtdID0geyAwIH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnIFtdID0geyB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsCiAJCQkJICAgIC5mbGFncyA9IDAsCiAJCQkJICAgIC5idWYgPSBiMCwgLmxlbiA9IDEgfSwKLQkJCQkgIHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJCSAgeyAuYWRkciA9IHN0YXRlLT5jb25maWcuZGVtb2RfYWRkcmVzcywKIAkJCQkgICAgLmZsYWdzID0gSTJDX01fUkQsCiAJCQkJICAgIC5idWYgPSBiMSwgLmxlbiA9IDEgfSB9OwogCkBAIC0xMDIsMTEgKzEwMiw2IEBACiAJcmV0dXJuIGIxWzBdOwogfQogCi1pbnQgbXQzNTJfcmVhZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggcmVnKQotewotCXJldHVybiBtdDM1Ml9yZWFkX3JlZ2lzdGVyKGZlLT5kZW1vZHVsYXRvcl9wcml2LHJlZyk7Ci19Ci0KIHN0YXRpYyBpbnQgbXQzNTJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RhdGljIHU4IG10MzUyX3NvZnRkb3duW10gPSB7IENMT0NLX0NUTCwgMHgyMCwgMHgwOCB9OwpAQCAtMTM0LDggKzEyOSw4IEBACiAJCWJ3ID0gODsKIAkJYnJlYWs7CiAJfQotCWlmIChzdGF0ZS0+Y29uZmlnLT5hZGNfY2xvY2spCi0JCWFkY19jbG9jayA9IHN0YXRlLT5jb25maWctPmFkY19jbG9jazsKKwlpZiAoc3RhdGUtPmNvbmZpZy5hZGNfY2xvY2spCisJCWFkY19jbG9jayA9IHN0YXRlLT5jb25maWcuYWRjX2Nsb2NrOwogCiAJdmFsdWUgPSA2NCAqIGJ3ICogKDE8PDE2KSAvICg3ICogOCk7CiAJdmFsdWUgPSB2YWx1ZSAqIDEwMDAgLyBhZGNfY2xvY2s7CkBAIC0xNTIsMTAgKzE0NywxMCBAQAogCWludCBpZjIgICAgICAgPSAzNjE2NzsgLyogMzYuMTY2NjY3IE1IeiAqLwogCWludCBpZmUsdmFsdWU7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+YWRjX2Nsb2NrKQotCQlhZGNfY2xvY2sgPSBzdGF0ZS0+Y29uZmlnLT5hZGNfY2xvY2s7Ci0JaWYgKHN0YXRlLT5jb25maWctPmlmMikKLQkJaWYyID0gc3RhdGUtPmNvbmZpZy0+aWYyOworCWlmIChzdGF0ZS0+Y29uZmlnLmFkY19jbG9jaykKKwkJYWRjX2Nsb2NrID0gc3RhdGUtPmNvbmZpZy5hZGNfY2xvY2s7CisJaWYgKHN0YXRlLT5jb25maWcuaWYyKQorCQlpZjIgPSBzdGF0ZS0+Y29uZmlnLmlmMjsKIAogCWlmZSA9ICgyKmFkY19jbG9jayAtIGlmMik7CiAJdmFsdWUgPSAtMTYzNzQgKiBpZmUgLyBhZGNfY2xvY2s7CkBAIC0yODksMTAgKzI4NCwxMCBAQAogCiAJbXQzNTJfY2FsY19ub21pbmFsX3JhdGUoc3RhdGUsIG9wLT5iYW5kd2lkdGgsIGJ1Zis0KTsKIAltdDM1Ml9jYWxjX2lucHV0X2ZyZXEoc3RhdGUsIGJ1Zis2KTsKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwYXJhbSwgYnVmKzgpOworCXN0YXRlLT5jb25maWcucGxsX3NldChmZSwgcGFyYW0sIGJ1Zis4KTsKIAogCW10MzUyX3dyaXRlKGZlLCBidWYsIHNpemVvZihidWYpKTsKLQlpZiAoc3RhdGUtPmNvbmZpZy0+bm9fdHVuZXIpIHsKKwlpZiAoc3RhdGUtPmNvbmZpZy5ub190dW5lcikgewogCQkvKiBzdGFydCBkZWNvZGluZyAqLwogCQltdDM1Ml93cml0ZShmZSwgZnNtX2dvLCAyKTsKIAl9IGVsc2UgewpAQCAtNTE2LDcgKzUxMSw3IEBACiAKIAkJLyogRG8gYSAiaGFyZCIgcmVzZXQgKi8KIAkJbXQzNTJfd3JpdGUoZmUsIG10MzUyX3Jlc2V0X2F0dGFjaCwgc2l6ZW9mKG10MzUyX3Jlc2V0X2F0dGFjaCkpOwotCQlyZXR1cm4gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfaW5pdChmZSk7CisJCXJldHVybiBzdGF0ZS0+Y29uZmlnLmRlbW9kX2luaXQoZmUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNTQxLDggKzUzNiw4IEBACiAJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKCpzdGF0ZSkpOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCi0Jc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPmNvbmZpZyxjb25maWcsc2l6ZW9mKHN0cnVjdCBtdDM1Ml9jb25maWcpKTsKIAltZW1jcHkoJnN0YXRlLT5vcHMsICZtdDM1Ml9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCkBAIC02MDEsMTAgKzU5NiwzIEBACiAKIEVYUE9SVF9TWU1CT0wobXQzNTJfYXR0YWNoKTsKIEVYUE9SVF9TWU1CT0wobXQzNTJfd3JpdGUpOwotRVhQT1JUX1NZTUJPTChtdDM1Ml9yZWFkKTsKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogY29tcGlsZS1jb21tYW5kOiAibWFrZSBEVkI9MSIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAppbmRleCBmNWQ4YTVhLi4wMzA0MGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaApAQCAtNjEsMTIgKzYxLDUgQEAKIAkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKIAogZXh0ZXJuIGludCBtdDM1Ml93cml0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTgqIGlidWYsIGludCBpbGVuKTsKLWV4dGVybiBpbnQgbXQzNTJfcmVhZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggcmVnKTsKIAogI2VuZGlmIC8vIE1UMzUyX0gKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAwMi5jCmluZGV4IDQ3NDNhYTEuLjM1YTFkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMDIuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiBzdGF0aWMgaW50IG54dDIwMDJfbG9hZF9maXJtd2FyZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCiB7CiAKLQlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG54dDIwMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCBidWZbMjU2XSx3cml0dGVuID0gMCxjaHVua3BvcyA9IDA7CiAJdTE2IHJhbWJhc2UscG9zaXRpb24sY3JjID0gMDsKIApAQCAtMzA5LDcgKzMwOSw3IEBACiBzdGF0aWMgaW50IG54dDIwMDJfc2V0dXBfZnJvbnRlbmRfcGFyYW1ldGVycyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXUzMiBmcmVxID0gMDsKIAl1MTYgdHVuZXJmcmVxID0gMDsKIAl1OCBidWZbNF07CkBAIC0zNDMsOCArMzQzLDYgQEAKIAkvKiByZXNldCB0aGUgYWdjIG5vdyB0aGF0IHR1bmluZyBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KIAlueHQyMDAyX2FnY19yZXNldChzdGF0ZSk7CiAKLQotCiAJLyogc2V0IHRhcmdldCBwb3dlciBsZXZlbCAqLwogCXN3aXRjaCAocC0+dS52c2IubW9kdWxhdGlvbikgewogCQljYXNlIFFBTV82NDoKQEAgLTQ1Myw3ICs0NTEsNyBAQAogCiBzdGF0aWMgaW50IG54dDIwMDJfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCiB7Ci0Jc3RydWN0IG54dDIwMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBueHQyMDAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG54dDIwMDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggbG9jazsKIAlpMmNfcmVhZGJ5dGVzKHN0YXRlLDB4MzEsJmxvY2ssMSk7CiAKQEAgLTQ3MCw3ICs0NjgsNyBAQAogCiBzdGF0aWMgaW50IG54dDIwMDJfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKQogewotCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IGJbM107CiAKIAlueHQyMDAyX3JlYWRyZWdfbXVsdGlieXRlKHN0YXRlLDB4RTYsYiwzKTsKQEAgLTQ4Miw3ICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IG54dDIwMDJfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IG54dDIwMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBueHQyMDAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG54dDIwMDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggYlsyXTsKIAl1MTYgdGVtcCA9IDA7CiAKQEAgLTUwMiw3ICs1MDAsNyBAQAogc3RhdGljIGludCBueHQyMDAyX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKIAotCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IGJbMl07CiAJdTE2IHRlbXAgPSAwLCB0ZW1wMjsKIAl1MzIgc25yZGIgPSAwOwpAQCAtNTM2LDcgKzUzNCw3IEBACiAKIHN0YXRpYyBpbnQgbnh0MjAwMl9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBueHQyMDAyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IGJbM107CiAKIAlueHQyMDAyX3JlYWRyZWdfbXVsdGlieXRlKHN0YXRlLDB4RTYsYiwzKTsKQEAgLTU1Miw3ICs1NTAsNyBAQAogCiBzdGF0aWMgaW50IG54dDIwMDJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG54dDIwMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CiAJdTggYnVmWzJdOwpAQCAtNjI0LDcgKzYyMiw3IEBACiAKIHN0YXRpYyB2b2lkIG54dDIwMDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG54dDIwMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTYzNyw3ICs2MzUsNyBAQAogCXU4IGJ1ZiBbXSA9IHswLDAsMCwwLDB9OwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBueHQyMDAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbnh0MjAwMl9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwppbmRleCBhNDFmN2RhLi45NjZkZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKQEAgLTE3NiwxMSArMTc2LDE2IEBACiAKIHN0YXRpYyB2b2lkIG54dDYwMDBfc2V0dXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBueHQ2MDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBSU19DT1JfU1lOQ19QQVJBTSwgU1lOQ19QQVJBTSk7CiAJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgQkVSX0NUUkwsIC8qKDEgPDwgMikgfCAqLyAoMHgwMSA8PCAxKSB8IDB4MDEpOwotCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIFZJVF9DT1JfQ1RMLCBWSVRfQ09SX1JFU1lOQyk7CisJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgVklUX0JFUlRJTUVfMiwgMHgwMCk7ICAvLyBCRVIgVGltZXIgPSAweDAwMDIwMCAqIDI1NiA9IDEzMTA3MiBiaXRzCisJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgVklUX0JFUlRJTUVfMSwgMHgwMik7ICAvLworCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIFZJVF9CRVJUSU1FXzAsIDB4MDApOyAgLy8KKwlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBWSVRfQ09SX0lOVEVOLCAweDk4KTsgLy8gRW5hYmxlIEJFUiBpbnRlcnJ1cHRzCisJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgVklUX0NPUl9DVEwsIDB4ODIpOyAgIC8vIEVuYWJsZSBCRVIgbWVhc3VyZW1lbnQKKwlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBWSVRfQ09SX0NUTCwgVklUX0NPUl9SRVNZTkMgfCAweDAyICk7CiAJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgT0ZETV9DT1JfQ1RMLCAoMHgwMSA8PCA1KSB8IChueHQ2MDAwX3JlYWRyZWcoc3RhdGUsIE9GRE1fQ09SX0NUTCkgJiAweDBGKSk7CiAJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgT0ZETV9DT1JfTU9ERUdVQVJELCBGT1JDRU1PREU4SyB8IDB4MDIpOwogCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIE9GRE1fQUdDX0NUTCwgQUdDTEFTVCB8IElOSVRJQUxfQUdDX0JXKTsKQEAgLTQyMiw3ICs0MjcsNyBAQAogc3RhdGljIGludCBueHQ2MDAwX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXU4IGNvcmVfc3RhdHVzOwotCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnN0YXR1cyA9IDA7CiAKQEAgLTQ1MSw3ICs0NTYsNyBAQAogCiBzdGF0aWMgaW50IG54dDYwMDBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG54dDYwMDBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCW54dDYwMDBfcmVzZXQoc3RhdGUpOwogCW54dDYwMDBfc2V0dXAoZmUpOwpAQCAtNDYxLDcgKzQ2Niw3IEBACiAKIHN0YXRpYyBpbnQgbnh0NjAwMF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW0pCiB7Ci0Jc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBueHQ2MDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJlc3VsdDsKIAogCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDEpOwkvKiBvcGVuIGkyYyBidXMgc3dpdGNoICovCkBAIC00ODIsMTAgKzQ4Nyw0NCBAQAogCiBzdGF0aWMgdm9pZCBueHQ2MDAwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBueHQ2MDAwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCitzdGF0aWMgaW50IG54dDYwMDBfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQoreworCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJKnNuciA9IG54dDYwMDBfcmVhZHJlZyggc3RhdGUsIE9GRE1fQ0hDX1NOUikgLyA4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnh0NjAwMF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlueHQ2MDAwX3dyaXRlcmVnKCBzdGF0ZSwgVklUX0NPUl9JTlRTVEFULCAweDE4ICk7CisKKwkqYmVyID0gKG54dDYwMDBfcmVhZHJlZyggc3RhdGUsIFZJVF9CRVJfMSApIDw8IDggKSB8CisJCW54dDYwMDBfcmVhZHJlZyggc3RhdGUsIFZJVF9CRVJfMCApOworCisJbnh0NjAwMF93cml0ZXJlZyggc3RhdGUsIFZJVF9DT1JfSU5UU1RBVCwgMHgxOCk7IC8vIENsZWFyIEJFUiBEb25lIGludGVycnVwdHMKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG54dDYwMDBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc2lnbmFsX3N0cmVuZ3RoKQoreworCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJKnNpZ25hbF9zdHJlbmd0aCA9IChzaG9ydCkgKDUxMSAtCisJCShueHQ2MDAwX3JlYWRyZWcoc3RhdGUsIEFHQ19HQUlOXzEpICsKKwkJKChueHQ2MDAwX3JlYWRyZWcoc3RhdGUsIEFHQ19HQUlOXzIpICYgMHgwMykgPDwgOCkpKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbnh0NjAwMF9vcHM7CiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG54dDYwMDBfYXR0YWNoKGNvbnN0IHN0cnVjdCBueHQ2MDAwX2NvbmZpZyogY29uZmlnLApAQCAtNDk0LDcgKzUzMyw3IEBACiAJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IG54dDYwMDBfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG54dDYwMDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpAQCAtNTQyLDYgKzU4MSw5IEBACiAJLnNldF9mcm9udGVuZCA9IG54dDYwMDBfc2V0X2Zyb250ZW5kLAogCiAJLnJlYWRfc3RhdHVzID0gbnh0NjAwMF9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSBueHQ2MDAwX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IG54dDYwMDBfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gbnh0NjAwMF9yZWFkX3NuciwKIH07CiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwX3ByaXYuaAppbmRleCA2NGIxYTg5Li4wNDIyZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMF9wcml2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDBfcHJpdi5oCkBAIC02NSwxMiArNjUsMjcgQEAKICNkZWZpbmUgQkVSX0RPTkUgICAgICAgICAgICAgICAoMHgwOCkKICNkZWZpbmUgQkVSX09WRVJGTE9XICAgICAgICAgICAoMHgxMCkKIAorLyogMHgzOCBWSVRfQkVSVElNRV8yICovCisjZGVmaW5lIFZJVF9CRVJUSU1FXzIgICAgICAoMHgzOCkKKworLyogMHgzOSBWSVRfQkVSVElNRV8xICovCisjZGVmaW5lIFZJVF9CRVJUSU1FXzEgICAgICAoMHgzOSkKKworLyogMHgzQSBWSVRfQkVSVElNRV8wICovCisjZGVmaW5lIFZJVF9CRVJUSU1FXzAgICAgICAoMHgzYSkKKwogCQkJICAgICAvKiAweDM4IE9GRE1fQkVSVGltZXIgKi8vKiBVc2UgdGhlIGFsaWFzIHJlZ2lzdGVycyAqLwogI2RlZmluZSBBX1ZJVF9CRVJfVElNRVJfMCAgICAgICgweDFEKQogCiAJCQkgICAgIC8qIDB4M0EgVklUX0JFUl9USU1FUl8wICovLyogVXNlIHRoZSBhbGlhcyByZWdpc3RlcnMgKi8KICNkZWZpbmUgQV9WSVRfQkVSXzAgICAgICAgICAgICAoMHgxQikKIAorLyogMHgzQiBWSVRfQkVSXzEgKi8KKyNkZWZpbmUgVklUX0JFUl8xICAgICAgICAgICAgICAoMHgzYikKKworLyogMHgzQyBWSVRfQkVSXzAgKi8KKyNkZWZpbmUgVklUX0JFUl8wICAgICAgICAgICAgICAoMHgzYykKKwogLyogMHg0MCBPRkRNX0NPUl9DVEwgKi8KICNkZWZpbmUgT0ZETV9DT1JfQ1RMICAgICAgICAgICAoMHg0MCkKICNkZWZpbmUgQ09SRUFDVCAgICAgICAgICAgICAgICAoMHgyMCkKQEAgLTExNyw2ICsxMzIsMTIgQEAKICNkZWZpbmUgT0ZETV9JVEJfQ1RMICAgICAgICAgICAoMHg0QikKICNkZWZpbmUgSVRCSU5WICAgICAgICAgICAgICAgICAoMHgwMSkKIAorLyogMHg0OSBBR0NfR0FJTl8xICovCisjZGVmaW5lIEFHQ19HQUlOXzEgICAgICAgICAgICAgKDB4NDkpCisKKy8qIDB4NEEgQUdDX0dBSU5fMiAqLworI2RlZmluZSBBR0NfR0FJTl8yICAgICAgICAgICAgICgweDRBKQorCiAvKiAweDRDIE9GRE1fSVRCX0ZSRVFfMSAqLwogI2RlZmluZSBPRkRNX0lUQl9GUkVRXzEgICAgICAgICgweDRDKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYwppbmRleCBkZjVkZWU3Li5jYzBhNzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiBzdGF0aWMgaW50IG9yNTExMzJfbG9hZF9maXJtd2FyZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCiB7Ci0Jc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBvcjUxMTMyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJc3RhdGljIHU4IHJ1bl9idWZbXSA9IHsweDdGLDB4MDF9OwogCXN0YXRpYyB1OCBnZXRfdmVyX2J1ZltdID0gezB4MDQsMHgwMCwweDMwLDB4MDAsMHgwMH07CiAJdTggcmVjX2J1ZlsxNF07CkBAIC0yNDAsNyArMjQwLDcgQEAKIAogc3RhdGljIGludCBvcjUxMTMyX3NldG1vZGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBvcjUxMTMyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdW5zaWduZWQgY2hhciBjbWRfYnVmWzRdOwogCiAJZHByaW50aygic2V0bW9kZSAlZFxuIiwoaW50KXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pOwpAQCAtMzE2LDcgKzMxNiw3IEBACiB7CiAJaW50IHJldDsKIAl1OCBidWZbNF07Ci0Jc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBvcjUxMTMyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAogCS8qIENoYW5nZSBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBjaGFuZ2luZyB0aGUgbW9kdWxhdGlvbiAqLwpAQCAtMzkxLDcgKzM5MSw3IEBACiAKIHN0YXRpYyBpbnQgb3I1MTEzMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG9yNTExMzJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIHJlY19idWZbMl07CiAJdW5zaWduZWQgY2hhciBzbmRfYnVmWzJdOwogCSpzdGF0dXMgPSAwOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIHN0YXRpYyBpbnQgb3I1MTEzMl9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKIHsKLQlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IG9yNTExMzJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIHJlY19idWZbMl07CiAJdW5zaWduZWQgY2hhciBzbmRfYnVmWzJdOwogCXU4IHJjdnJfc3RhdDsKQEAgLTUxMiw3ICs1MTIsNyBAQAogCiBzdGF0aWMgaW50IG9yNTExMzJfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXVuc2lnbmVkIGNoYXIgcmVjX2J1ZlsyXTsKIAl1bnNpZ25lZCBjaGFyIHNuZF9idWZbMl07CiAJdTE2IHNucl9lcXU7CkBAIC01NDksNyArNTQ5LDcgQEAKIAogc3RhdGljIHZvaWQgb3I1MTEzMl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jCmluZGV4IDU4YWQzNGUuLjc2NGE5NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogc3RhdGljIGludCBzcDg4NzBfc2V0X2Zyb250ZW5kX3BhcmFtZXRlcnMgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCQkgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50ICBlcnI7CiAJdTE2IHJlZzB4YzA1OwogCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogc3RhdGljIGludCBzcDg4NzBfaW5pdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAgICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOwogCiAJc3A4ODcwX3dha2VfdXAoc3RhdGUpOwpAQCAtMzU4LDcgKzM1OCw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODcwX3JlYWRfc3RhdHVzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QgKiBmZV9zdGF0dXMpCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHN0YXR1czsKIAlpbnQgc2lnbmFsOwogCkBAIC0zODQsNyArMzg0LDcgQEAKIAogc3RhdGljIGludCBzcDg4NzBfcmVhZF9iZXIgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKiBiZXIpCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1MzIgdG1wOwogCkBAIC00MTIsNyArNDEyLDcgQEAKIAogc3RhdGljIGludCBzcDg4NzBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsICB1MTYgKiBzaWduYWwpCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAl1MTYgdG1wOwogCkBAIC00MzgsNyArNDM4LDcgQEAKIAogc3RhdGljIGludCBzcDg4NzBfcmVhZF91bmNvcnJlY3RlZF9ibG9ja3MgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVibG9ja3MpCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldDsKIAogCSp1YmxvY2tzID0gMDsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCiBzdGF0aWMgaW50IHNwODg3MF9zZXRfZnJvbnRlbmQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKgogCSAgICBUaGUgZmlybXdhcmUgb2YgdGhlIHNwODg3MCBzb21ldGltZXMgbG9ja3MgdXAgYWZ0ZXIgc2V0dGluZyBmcm9udGVuZCBwYXJhbWV0ZXJzLgpAQCAtNTI0LDcgKzUyNCw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODcwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzcDg4NzBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3A4ODcwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJLy8gdHJpc3RhdGUgVFMgb3V0cHV0IGFuZCBkaXNhYmxlIGludGVyZmFjZSBwaW5zCiAJcmV0dXJuIHNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHhDMTgsIDB4MDAwKTsKQEAgLTU0MCw3ICs1NDAsNyBAQAogCiBzdGF0aWMgdm9pZCBzcDg4NzBfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3Qgc3A4ODcwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODcwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTU1Miw3ICs1NTIsNyBAQAogCXN0cnVjdCBzcDg4NzBfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHNwODg3MF9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcDg4NzBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcDg4NzBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jCmluZGV4IDdlYWU4MzMuLmQ4NjhhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogICovCiBzdGF0aWMgaW50IHNwODg3eF9pbml0aWFsX3NldHVwIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKIHsKLQlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODd4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCBidWYgW0JMT0NLU0laRSsyXTsKIAlpbnQgaTsKIAlpbnQgZndfc2l6ZSA9IGZ3LT5zaXplOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiBzdGF0aWMgaW50IHNwODg3eF9zZXR1cF9mcm9udGVuZF9wYXJhbWV0ZXJzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGFjdHVhbF9mcmVxLCBlcnI7CiAJdTE2IHZhbCwgcmVnMHhjMDU7CiAKQEAgLTQwNSw3ICs0MDUsNyBAQAogCiBzdGF0aWMgaW50IHNwODg3eF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODd4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MTYgc25yMTIgPSBzcDg4N3hfcmVhZHJlZyhzdGF0ZSwgMHhmMTYpOwogCXUxNiBzeW5jMHgyMDAgPSBzcDg4N3hfcmVhZHJlZyhzdGF0ZSwgMHgyMDApOwogCXUxNiBzeW5jMHhmMTcgPSBzcDg4N3hfcmVhZHJlZyhzdGF0ZSwgMHhmMTcpOwpAQCAtNDM5LDcgKzQzOSw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODd4X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKIHsKLQlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODd4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSpiZXIgPSAoc3A4ODd4X3JlYWRyZWcoc3RhdGUsIDB4YzA4KSAmIDB4M2YpIHwKIAkgICAgICAgKHNwODg3eF9yZWFkcmVnKHN0YXRlLCAweGMwNykgPDwgNik7CkBAIC00NTMsNyArNDUzLDcgQEAKIAogc3RhdGljIGludCBzcDg4N3hfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1MTYgc25yMTIgPSBzcDg4N3hfcmVhZHJlZyhzdGF0ZSwgMHhmMTYpOwogCXUzMiBzaWduYWwgPSAzICogKHNucjEyIDw8IDQpOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODd4X3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODd4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXUxNiBzbnIxMiA9IHNwODg3eF9yZWFkcmVnKHN0YXRlLCAweGYxNik7CiAJKnNuciA9IChzbnIxMiA8PCA0KSB8IChzbnIxMiA+PiA4KTsKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCiBzdGF0aWMgaW50IHNwODg3eF9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzcDg4N3hfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnVjYmxvY2tzID0gc3A4ODd4X3JlYWRyZWcoc3RhdGUsIDB4YzBjKTsKIAlpZiAoKnVjYmxvY2tzID09IDB4ZmZmKQpAQCAtNDg1LDcgKzQ4NSw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODd4X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzcDg4N3hfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJLyogdHJpc3RhdGUgVFMgb3V0cHV0IGFuZCBkaXNhYmxlIGludGVyZmFjZSBwaW5zICovCiAJc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweGMxOCwgMHgwMDApOwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAKIHN0YXRpYyBpbnQgc3A4ODd4X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHNwODg3eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAgICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOwogCWludCByZXQ7CiAKQEAgLTUzNCw3ICs1MzQsNyBAQAogCiBzdGF0aWMgdm9pZCBzcDg4N3hfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3A4ODd4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHNwODg3eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTU0Niw3ICs1NDYsNyBAQAogCXN0cnVjdCBzcDg4N3hfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHNwODg3eF9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcDg4N3hfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcDg4N3hfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKaW5kZXggNTAyYzY0MC4uZTY4MTI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogaW50IHN0djAyOTdfZW5hYmxlX3BsbGkyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHN0djAyOTdfc3RhdGUgKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDg3LCAweDc4KTsKIAlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDg2LCAweGM4KTsKQEAgLTM3NSw3ICszNzUsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTdfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHN0djAyOTdfc3RhdGUgKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAKIAkvKiBzb2Z0IHJlc2V0ICovCkBAIC00MTYsNyArNDE2LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk3X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewotCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg4MCwgMSwgMSk7CiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTdfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICogc3RhdHVzKQogewotCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IHN5bmMgPSBzdHYwMjk3X3JlYWRyZWcoc3RhdGUsIDB4REYpOwogCkBAIC00MzgsNyArNDM4LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk3X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKiBiZXIpCiB7Ci0Jc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzdHYwMjk3X3N0YXRlICopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IEJFUlszXTsKIAogCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4QTAsIDB4ODApOwkvLyBTdGFydCBDb3VudGluZyBiaXQgZXJyb3JzIGZvciA0MDk2IEJ5dGVzCkBAIC00NTMsNyArNDUzLDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk3X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKiBzdHJlbmd0aCkKIHsKLQlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHN0djAyOTdfc3RhdGUgKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggU1RSRU5HVEhbMl07CiAKIAlzdHYwMjk3X3JlYWRyZWdzKHN0YXRlLCAweDQxLCBTVFJFTkdUSCwgMik7CkBAIC00NjQsNyArNDY0LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk3X3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKiBzbnIpCiB7Ci0Jc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzdHYwMjk3X3N0YXRlICopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IFNOUlsyXTsKIAogCXN0djAyOTdfcmVhZHJlZ3Moc3RhdGUsIDB4MDcsIFNOUiwgMik7CkBAIC00NzUsNyArNDc1LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk3X3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqIHVjYmxvY2tzKQogewotCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSp1Y2Jsb2NrcyA9IChzdHYwMjk3X3JlYWRyZWcoc3RhdGUsIDB4RDUpIDw8IDgpCiAJCXwgc3R2MDI5N19yZWFkcmVnKHN0YXRlLCAweEQ0KTsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTdfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzdHYwMjk3X3N0YXRlICopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCB1X3RocmVzaG9sZDsKIAlpbnQgaW5pdGlhbF91OwogCWludCBibGluZF91OwpAQCAtNjg5LDcgKzY4OSw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5N19nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHN0djAyOTdfc3RhdGUgKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJlZ18wMCwgcmVnXzgzOwogCiAJcmVnXzAwID0gc3R2MDI5N19yZWFkcmVnKHN0YXRlLCAweDAwKTsKQEAgLTcyNSw3ICs3MjUsNyBAQAogCiBzdGF0aWMgdm9pZCBzdHYwMjk3X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0Jc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzdHYwMjk3X3N0YXRlICopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtNzM3LDcgKzczNyw3IEBACiAJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHN0djAyOTdfc3RhdGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0djAyOTdfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHYwMjk3X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCmluZGV4IDE1YjQwNTQuLmNmYTM5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYwpAQCAtNzAsNiArNzAsNyBAQAogI2RlZmluZSBTVEFUVVNfVUNCTE9DS1MgMQogCiBzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2g7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXAogCQlpZiAoZGVidWcpIHByaW50ayhLRVJOX0RFQlVHICJzdHYwMjk5OiAiIGFyZ3MpOyBcCkBAIC05Myw3ICs5NCw3IEBACiAKIGludCBzdHYwMjk5X3dyaXRlcmVnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggcmVnLCB1OCBkYXRhKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIHJlZywgZGF0YSk7CiB9CkBAIC0yMTgsNyArMjE5LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk5X3NldF9zeW1ib2xyYXRlIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTY0IGJpZyA9IHNyYXRlOwogCXUzMiByYXRpbzsKIApAQCAtMjY5LDcgKzI3MCw3IEBACiBzdGF0aWMgaW50IHN0djAyOTlfc2VuZF9kaXNlcWNfbXNnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCQkgICAgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqbSkKIHsKLSAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzdHYwMjk5X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHZhbDsKIAlpbnQgaTsKIApAQCAtMjk5LDcgKzMwMCw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9zZW5kX2Rpc2VxY19idXJzdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggdmFsOwogCiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzI2LDcgKzMyNyw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9zZXRfdG9uZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggdmFsOwogCiAJaWYgKHN0djAyOTlfd2FpdF9kaXNlcWNfaWRsZSAoc3RhdGUsIDEwMCkgPCAwKQpAQCAtMzQ4LDcgKzM0OSw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKLSAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzdHYwMjk5X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHJlZzB4MDg7CiAJdTggcmVnMHgwYzsKIApAQCAtMzg1LDM0ICszODYsODQgQEAKIAl9OwogfQogCi1zdGF0aWMgaW50IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBjbWQpCitzdGF0aWMgaW5saW5lIHMzMiBzdHYwMjk5X2NhbGNfdXNlY19kZWxheSAoc3RydWN0IHRpbWV2YWwgbGFzdHRpbWUsIHN0cnVjdCB0aW1ldmFsIGN1cnRpbWUpCiB7CisJcmV0dXJuICgoY3VydGltZS50dl91c2VjIDwgbGFzdHRpbWUudHZfdXNlYykgPworCQkxMDAwMDAwIC0gbGFzdHRpbWUudHZfdXNlYyArIGN1cnRpbWUudHZfdXNlYyA6CisJCWN1cnRpbWUudHZfdXNlYyAtIGxhc3R0aW1lLnR2X3VzZWMpOworfQorCitzdGF0aWMgdm9pZCBzdHYwMjk5X3NsZWVwX3VudGlsIChzdHJ1Y3QgdGltZXZhbCAqd2FrZXRpbWUsIHUzMiBhZGRfdXNlYykKK3sKKwlzdHJ1Y3QgdGltZXZhbCBsYXN0dGltZTsKKwlzMzIgZGVsdGEsIG5ld2RlbHRhOworCisJd2FrZXRpbWUtPnR2X3VzZWMgKz0gYWRkX3VzZWM7CisJaWYgKHdha2V0aW1lLT50dl91c2VjID49IDEwMDAwMDApIHsKKwkJd2FrZXRpbWUtPnR2X3VzZWMgLT0gMTAwMDAwMDsKKwkJd2FrZXRpbWUtPnR2X3NlYysrOworCX0KKworCWRvX2dldHRpbWVvZmRheSAoJmxhc3R0aW1lKTsKKwlkZWx0YSA9IHN0djAyOTlfY2FsY191c2VjX2RlbGF5IChsYXN0dGltZSwgKndha2V0aW1lKTsKKwlpZiAoZGVsdGEgPiAyNTAwKSB7CisJCW1zbGVlcCAoKGRlbHRhIC0gMTUwMCkgLyAxMDAwKTsKKwkJZG9fZ2V0dGltZW9mZGF5ICgmbGFzdHRpbWUpOworCQluZXdkZWx0YSA9IHN0djAyOTlfY2FsY191c2VjX2RlbGF5IChsYXN0dGltZSwgKndha2V0aW1lKTsKKwkJZGVsdGEgPSAobmV3ZGVsdGEgPiBkZWx0YSkgPyAwIDogbmV3ZGVsdGE7CisJfQorCWlmIChkZWx0YSA+IDApCisJCXVkZWxheSAoZGVsdGEpOworfQorCitzdGF0aWMgaW50IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgY21kKQoreworCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHJlZzB4MDg7CisJdTggcmVnMHgwYzsKKwl1OCBsdl9tYXNrID0gMHg0MDsKIAl1OCBsYXN0ID0gMTsKIAlpbnQgaTsKKwlzdHJ1Y3QgdGltZXZhbCBuZXh0dGltZTsKKwlzdHJ1Y3QgdGltZXZhbCB0dlsxMF07CiAKLQkvKiByZXNldCB2b2x0YWdlIGF0IHRoZSBlbmQKLQlpZigoMHg1MCAmIHN0djAyOTlfcmVhZHJlZyAoaTJjLCAweDBjKSkgPT0gMHg1MCkKLQkJY21kIHw9IDB4ODA7Ci0JZWxzZQotCQljbWQgJj0gMHg3RjsKLQkqLworCXJlZzB4MDggPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDA4KTsKKwlyZWcweDBjID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwYyk7CisJcmVnMHgwYyAmPSAweDBmOworCXN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgKHJlZzB4MDggJiAweDNmKSB8IChzdGF0ZS0+Y29uZmlnLT5sb2NrX291dHB1dCA8PCA2KSk7CisJaWYgKHN0YXRlLT5jb25maWctPnZvbHQxM19vcDBfb3AxID09IFNUVjAyOTlfVk9MVDEzX09QMCkKKwkJbHZfbWFzayA9IDB4MTA7CiAKIAljbWQgPSBjbWQgPDwgMTsKLQlkcHJpbnRrKCIlcyBzd2l0Y2ggY29tbWFuZDogMHglMDR4XG4iLF9fRlVOQ1RJT05fXywgY21kKTsKKwlpZiAoZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoKQorCQlwcmludGsgKCIlcyBzd2l0Y2ggY29tbWFuZDogMHglMDR4XG4iLF9fRlVOQ1RJT05fXywgY21kKTsKIAotCXN0djAyOTlfc2V0X3ZvbHRhZ2UoZmUsU0VDX1ZPTFRBR0VfMTgpOwotCW1zbGVlcCgzMik7CisJZG9fZ2V0dGltZW9mZGF5ICgmbmV4dHRpbWUpOworCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCisJCW1lbWNweSAoJnR2WzBdLCAmbmV4dHRpbWUsIHNpemVvZiAoc3RydWN0IHRpbWV2YWwpKTsKKwlzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MGMsIHJlZzB4MGMgfCAweDUwKTsgLyogc2V0IExOQiB0byAxOFYgKi8KKworCXN0djAyOTlfc2xlZXBfdW50aWwgKCZuZXh0dGltZSwgMzIwMDApOwogCiAJZm9yIChpPTA7IGk8OTsgaSsrKSB7CisJCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCisJCQlkb19nZXR0aW1lb2ZkYXkgKCZ0dltpKzFdKTsKIAkJaWYoKGNtZCAmIDB4MDEpICE9IGxhc3QpIHsKLQkJCXN0djAyOTlfc2V0X3ZvbHRhZ2UoZmUsIGxhc3QgPyBTRUNfVk9MVEFHRV8xMyA6IFNFQ19WT0xUQUdFXzE4KTsKKwkJCS8qIHNldCB2b2x0YWdlIHRvIChsYXN0ID8gMTNWIDogMThWKSAqLworCQkJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDBjLCByZWcweDBjIHwgKGxhc3QgPyBsdl9tYXNrIDogMHg1MCkpOwogCQkJbGFzdCA9IChsYXN0KSA/IDAgOiAxOwogCQl9CiAKIAkJY21kID0gY21kID4+IDE7CiAKIAkJaWYgKGkgIT0gOCkKLQkJCW1zbGVlcCg4KTsKKwkJCXN0djAyOTlfc2xlZXBfdW50aWwgKCZuZXh0dGltZSwgODAwMCk7CisJfQorCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpIHsKKwkJcHJpbnRrICgiJXMoJWQpOiBzd2l0Y2ggZGVsYXkgKHNob3VsZCBiZSAzMmsgZm9sbG93ZWQgYnkgYWxsIDhrXG4iLAorCQkJX19GVU5DVElPTl9fLCBmZS0+ZHZiLT5udW0pOworCQlmb3IgKGk9MTsgaSA8IDEwOyBpKyspCisJCQlwcmludGsgKCIlZDogJWRcbiIsIGksIHN0djAyOTlfY2FsY191c2VjX2RlbGF5ICh0dltpLTFdICwgdHZbaV0pKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQyMCw3ICs0NzEsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTlfaW5pdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0gICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgaTsKIAogCWRwcmludGsoInN0djAyOTk6IGluaXQgY2hpcFxuIik7CkBAIC00MzksNyArNDkwLDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk5X3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1OCBzaWduYWwgPSAweGZmIC0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOCk7CiAJdTggc3luYyA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWIpOwpAQCAtNDY3LDcgKzUxOCw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0gICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWlmIChzdGF0ZS0+ZXJybW9kZSAhPSBTVEFUVVNfQkVSKSByZXR1cm4gMDsKIAkqYmVyID0gKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWQpIDw8IDgpIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZSk7CkBAIC00NzcsNyArNTI4LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzMzIgc2lnbmFsID0gIDB4ZmZmZiAtICgoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOCkgPDwgOCkKIAkJCSAgICAgICB8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTkpKTsKQEAgLTQ5NCw3ICs1NDUsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTlfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzMzIgeHNuciA9IDB4ZmZmZiAtICgoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgyNCkgPDwgOCkKIAkJCSAgIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgyNSkpOwpAQCAtNTA2LDcgKzU1Nyw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlpZiAoc3RhdGUtPmVycm1vZGUgIT0gU1RBVFVTX1VDQkxPQ0tTKSAqdWNibG9ja3MgPSAwOwogCWVsc2UgKnVjYmxvY2tzID0gKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWQpIDw8IDgpIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZSk7CkBAIC01MTYsNyArNTY3LDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk5X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICogcCkKIHsKLSAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzdHYwMjk5X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBpbnZ2YWwgPSAwOwogCiAJZHByaW50ayAoIiVzIDogRkVfU0VUX0ZST05URU5EXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTg0LDcgKzYzNSw3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDI5OV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqIHApCiB7Ci0gICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlzMzIgZGVyb3RfZnJlcTsKIAlpbnQgaW52dmFsOwogCkBAIC02MDksNyArNjYwLDcgQEAKIAogc3RhdGljIGludCBzdHYwMjk5X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHN0djAyOTlfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwMiwgMHg4MCk7CiAJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKQEAgLTYxOSw3ICs2NzAsNyBAQAogCiBzdGF0aWMgaW50IHN0djAyOTlfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKIHsKLSAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBzdHYwMjk5X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gc3RhdGUtPmNvbmZpZy0+bWluX2RlbGF5X21zOwogCWlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSB7CkBAIC02MzQsNyArNjg1LDcgQEAKIAogc3RhdGljIHZvaWQgc3R2MDI5OV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtNjQ3LDcgKzY5OCw3IEBACiAJaW50IGlkOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHYwMjk5X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCkBAIC03MTksNiArNzcwLDkgQEAKIAkuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQsCiB9OwogCittb2R1bGVfcGFyYW0oZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gsICJFbmFibGUgdGltaW5nIGFuYWx5c2lzIGZvciBEaXNoIE5ldHdvcmsgbGVnYWN5IHN3aXRjaGVzIik7CisKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwppbmRleCA0ZTQwZDk1Li44N2Q1ZjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIHN0YXRpYyBpbnQgdGRhMTAwMjFfaW5pdCAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0Jc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAKIAlkcHJpbnRrKCJEVkI6IFREQTEwMDIxKCVkKTogaW5pdCBjaGlwXG4iLCBmZS0+YWRhcHRlci0+bnVtKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogc3RhdGljIGludCB0ZGExMDAyMV9zZXRfcGFyYW1ldGVycyAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJCQkgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTEwMDIxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJLy90YWJsZSBmb3IgUUFNNC1RQU0yNTYgcmVhZHkgIFFBTTQgIFFBTTE2IFFBTTMyIFFBTTY0IFFBTTEyOCBRQU0yNTYKIAkvL0NPTkYKQEAgLTI3OCw3ICsyNzgsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewotCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTEwMDIxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBzeW5jOwogCiAJKnN0YXR1cyA9IDA7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAogc3RhdGljIGludCB0ZGExMDAyMV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1MzIgX2JlciA9IHRkYTEwMDIxX3JlYWRyZWcoc3RhdGUsIDB4MTQpIHwKIAkJKHRkYTEwMDIxX3JlYWRyZWcoc3RhdGUsIDB4MTUpIDw8IDgpIHwKQEAgLTMxNSw3ICszMTUsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQogewotCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTEwMDIxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggZ2FpbiA9IHRkYTEwMDIxX3JlYWRyZWcoc3RhdGUsIDB4MTcpOwogCSpzdHJlbmd0aCA9IChnYWluIDw8IDgpIHwgZ2FpbjsKQEAgLTMyNSw3ICszMjUsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IHF1YWxpdHkgPSB+dGRhMTAwMjFfcmVhZHJlZyhzdGF0ZSwgMHgxOCk7CiAJKnNuciA9IChxdWFsaXR5IDw8IDgpIHwgcXVhbGl0eTsKQEAgLTMzNSw3ICszMzUsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCiB7Ci0Jc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqdWNibG9ja3MgPSB0ZGExMDAyMV9yZWFkcmVnIChzdGF0ZSwgMHgxMykgJiAweDdmOwogCWlmICgqdWNibG9ja3MgPT0gMHg3ZikKQEAgLTM1MCw3ICszNTAsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTEwMDIxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBzeW5jOwogCXM4IGFmYyA9IDA7CiAKQEAgLTM3OCw3ICszNzgsNyBAQAogCiBzdGF0aWMgaW50IHRkYTEwMDIxX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTEwMDIxX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdGRhMTAwMjFfd3JpdGVyZWcgKHN0YXRlLCAweDFiLCAweDAyKTsgIC8qIHBkb3duIEFEQyAqLwogCXRkYTEwMDIxX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHg4MCk7ICAvKiBzdGFuZGJ5ICovCkBAIC0zODgsNyArMzg4LDcgQEAKIAogc3RhdGljIHZvaWQgdGRhMTAwMjFfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTQwMSw3ICs0MDEsNyBAQAogCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCmluZGV4IDY4N2FkOWMuLjBiZWIzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCkBAIC0zNSw5ICszNSwxMCBAQAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAKLSNkZWZpbmUgVERBMTAwNFhfREVNT0RfVERBMTAwNDUgMAotI2RlZmluZSBUREExMDA0WF9ERU1PRF9UREExMDA0NiAxCi0KK2VudW0gdGRhMTAwNHhfZGVtb2QgeworCVREQTEwMDRYX0RFTU9EX1REQTEwMDQ1LAorCVREQTEwMDRYX0RFTU9EX1REQTEwMDQ2LAorfTsKIAogc3RydWN0IHRkYTEwMDR4X3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKQEAgLTQ2LDggKzQ3LDkgQEAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCiAJLyogcHJpdmF0ZSBkZW1vZCBkYXRhICovCi0JdTggaW5pdGlhbGlzZWQ6MTsKLQl1OCBkZW1vZF90eXBlOworCXU4IGluaXRpYWxpc2VkOworCWVudW0gdGRhMTAwNHhfZGVtb2QgZGVtb2RfdHlwZTsKKwl1OCBmd192ZXJzaW9uOwogfTsKIAogCkBAIC0xMzksNyArMTQxLDcgQEAKIHsKIAlpbnQgcmV0OwogCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyPTAsIC5mbGFncz0wLCAuYnVmPWJ1ZiwgLmxlbj0yIH07CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMiB9OwogCiAJZHByaW50aygiJXM6IHJlZz0weCV4LCBkYXRhPTB4JXhcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCBkYXRhKTsKIApAQCAtMTYwLDggKzE2Miw4IEBACiAJaW50IHJldDsKIAl1OCBiMFtdID0geyByZWcgfTsKIAl1OCBiMVtdID0geyAwIH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7eyAuYWRkcj0wLCAuZmxhZ3M9MCwgLmJ1Zj1iMCwgLmxlbj0xfSwKLQkJCQl7IC5hZGRyPTAsIC5mbGFncz1JMkNfTV9SRCwgLmJ1Zj1iMSwgLmxlbiA9IDF9fTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHt7IC5mbGFncyA9IDAsIC5idWYgPSBiMCwgLmxlbiA9IDEgfSwKKwkJCQl7IC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH19OwogCiAJZHByaW50aygiJXM6IHJlZz0weCV4XG4iLCBfX0ZVTkNUSU9OX18sIHJlZyk7CiAKQEAgLTI5NCw3ICsyOTYsNyBAQAogCQkJICAgICAgdTggZHNwQ29kZUNvdW50ZXJSZWcsIHU4IGRzcENvZGVJblJlZykKIHsKIAl1OCBidWZbNjVdOwotCXN0cnVjdCBpMmNfbXNnIGZ3X21zZyA9IHsuYWRkciA9IDAsLmZsYWdzID0gMCwuYnVmID0gYnVmLC5sZW4gPSAwIH07CisJc3RydWN0IGkyY19tc2cgZndfbXNnID0geyAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMCB9OwogCWludCB0eF9zaXplOwogCWludCBwb3MgPSAwOwogCkBAIC0zMDQsMTIgKzMwNiwxMCBAQAogCiAJYnVmWzBdID0gZHNwQ29kZUluUmVnOwogCXdoaWxlIChwb3MgIT0gbGVuKSB7Ci0KIAkJLy8gd29yayBvdXQgaG93IG11Y2ggdG8gc2VuZCB0aGlzIHRpbWUKIAkJdHhfc2l6ZSA9IGxlbiAtIHBvczsKLQkJaWYgKHR4X3NpemUgPiAweDEwKSB7CisJCWlmICh0eF9zaXplID4gMHgxMCkKIAkJCXR4X3NpemUgPSAweDEwOwotCQl9CiAKIAkJLy8gc2VuZCB0aGUgY2h1bmsKIAkJbWVtY3B5KGJ1ZiArIDEsIG1lbSArIHBvcywgdHhfc2l6ZSk7CkBAIC0zMjIsNiArMzIyLDcgQEAKIAogCQlkcHJpbnRrKCIlczogZndfcG9zPTB4JXhcbiIsIF9fRlVOQ1RJT05fXywgcG9zKTsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM1LDkgKzMzNiw4IEBACiAKIAlkYXRhMSA9IHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfRFNQX0RBVEExKTsKIAlkYXRhMiA9IHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfRFNQX0RBVEEyKTsKLQlpZiAoZGF0YTEgIT0gMHg2NyB8fCBkYXRhMiAhPSBkc3BWZXJzaW9uKSB7CisJaWYgKChkYXRhMSAhPSAweDY3KSB8fCAoZGF0YTIgIT0gZHNwVmVyc2lvbikpCiAJCXJldHVybiAtRUlPOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMzQ4LDkgKzM0OCw5IEBACiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCi0KIAkvKiBkb24ndCByZS11cGxvYWQgdW5sZXNzIG5lY2Vzc2FyeSAqLwotCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MmMpID09IDApIHJldHVybiAwOworCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MmMpID09IDApCisJCXJldHVybiAwOwogCiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KIAlwcmludGsoInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgVERBMTAwNDVfREVGQVVMVF9GSVJNV0FSRSk7CkBAIC0zODEsNiArMzgxLDI1IEBACiAJcmV0dXJuIHRkYTEwMDR4X2NoZWNrX3VwbG9hZF9vayhzdGF0ZSwgMHgyYyk7CiB9CiAKK3N0YXRpYyBpbnQgdGRhMTAwNDZfZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgcGF0dGVybltdID0geyAweDY3LCAweDAwLCAweDUwLCAweDYyLCAweDVlLCAweDE4LCAweDY3IH07CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBhcmVhIGd1ZXNzZWQgZnJvbSBmaXJtd2FyZSB2MjAsIHYyMSBhbmQgdjI1ICovCisJZm9yIChpID0gMHg2NjA7IGkgPCAweDcwMDsgaSsrKSB7CisJCWlmICghbWVtY21wKCZmdy0+ZGF0YVtpXSwgcGF0dGVybiwgc2l6ZW9mKHBhdHRlcm4pKSkgeworCQkJc3RhdGUtPmZ3X3ZlcnNpb24gPSBmdy0+ZGF0YVtpICsgc2l6ZW9mKHBhdHRlcm4pXTsKKwkJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB1c2luZyBmaXJtd2FyZSB2JTAyeFxuIiwKKwkJCQkJc3RhdGUtPmZ3X3ZlcnNpb24pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCB0ZGExMDA0Nl9md3VwbG9hZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC0zOTQsNyArNDEzLDggQEAKIAltc2xlZXAoMTAwKTsKIAogCS8qIGRvbid0IHJlLXVwbG9hZCB1bmxlc3MgbmVjZXNzYXJ5ICovCi0JaWYgKHRkYTEwMDR4X2NoZWNrX3VwbG9hZF9vayhzdGF0ZSwgMHgyMCkgPT0gMCkgcmV0dXJuIDA7CisJaWYgKHRkYTEwMDR4X2NoZWNrX3VwbG9hZF9vayhzdGF0ZSwgc3RhdGUtPmZ3X3ZlcnNpb24pID09IDApCisJCXJldHVybiAwOwogCiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KIAlwcmludGsoInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgVERBMTAwNDZfREVGQVVMVF9GSVJNV0FSRSk7CkBAIC00MDQsOSArNDI0LDIwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJaWYgKGZ3LT5zaXplIDwgMjQ0NzgpIHsgLyogc2l6ZSBvZiBmaXJtd2FyZSB2MjAsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBvZiB2MjAsIHYyMSBhbmQgdjI1ICovCisJCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIGZpbGUgc2VlbXMgdG8gYmUgdG9vIHNtYWxsICglZCBieXRlcylcbiIsIGZ3LT5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gdGRhMTAwNDZfZ2V0X2Z3X3ZlcnNpb24oc3RhdGUsIGZ3KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoInRkYTEwMDR4OiB1bmFibGUgdG8gZmluZCBmaXJtd2FyZSB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAkvKiBzZXQgcGFyYW1ldGVycyAqLwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCAwKTsKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCBzdGF0ZS0+Y29uZmlnLT5uX2kyYyk7CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDJjKTsKQEAgLTQxOSw3ICs0NTAsNyBAQAogCiAJLyogd2FpdCBmb3IgRFNQIHRvIGluaXRpYWxpc2UgKi8KIAl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCXdoaWxlKCEodGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9TVEFUVVNfQ0QpICYgMHgyMCkpIHsKKwl3aGlsZSAoISh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1NUQVRVU19DRCkgJiAweDIwKSkgewogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewogCQkJcHJpbnRrKCJ0ZGExMDA0eDogRFNQIGZhaWxlZCB0byBpbml0aWFsaXNlZC5cbiIpOwogCQkJcmV0dXJuIC1FSU87CkBAIC00MjcsNyArNDU4LDcgQEAKIAkJbXNsZWVwKDEpOwogCX0KIAotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MjApOworCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIHN0YXRlLT5md192ZXJzaW9uKTsKIH0KIAogc3RhdGljIGludCB0ZGExMDA0eF9lbmNvZGVfZmVjKGludCBmZWMpCkBAIC00ODMsNyArNTE0LDggQEAKIAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKHN0YXRlLT5pbml0aWFsaXNlZCkgcmV0dXJuIDA7CisJaWYgKHN0YXRlLT5pbml0aWFsaXNlZCkKKwkJcmV0dXJuIDA7CiAKIAlpZiAodGRhMTAwNDVfZnd1cGxvYWQoZmUpKSB7CiAJCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWRcbiIpOwpAQCAtNTIzLDcgKzU1NSw4IEBACiAJc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKHN0YXRlLT5pbml0aWFsaXNlZCkgcmV0dXJuIDA7CisJaWYgKHN0YXRlLT5pbml0aWFsaXNlZCkKKwkJcmV0dXJuIDA7CiAKIAlpZiAodGRhMTAwNDZfZnd1cGxvYWQoZmUpKSB7CiAJCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWRcbiIpOwpAQCAtNTQ1LDcgKzU3OCw3IEBACiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgOCwgMCk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzEsIDB4ODAsIDApOyAvLyBkaXNhYmxlIHB1bHNlIGtpbGxlcgogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIDApOyAvLyBQTEwgUCA9IE4gPSAwCisJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GUExMMywgc3RhdGUtPmNvbmZpZy0+bl9pMmMpOyAvLyBQTEwgUCA9IE4gPSAwCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOyAvLyBGUkVRT0ZGUyA9IDk5CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweGQ0KTsgLy8gfSBQSFkyID0gLTExMjIxCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDJjKTsgLy8gfQpAQCAtNjIxLDEyICs2NTQsMTQgQEAKIAogCQkvLyBzZXQgSFAgRkVDCiAJCXRtcCA9IHRkYTEwMDR4X2VuY29kZV9mZWMoZmVfcGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0hQKTsKLQkJaWYgKHRtcCA8IDApIHJldHVybiB0bXA7CisJCWlmICh0bXAgPCAwKQorCQkJcmV0dXJuIHRtcDsKIAkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfSU5fQ09ORjIsIDcsIHRtcCk7CiAKIAkJLy8gc2V0IExQIEZFQwogCQl0bXAgPSB0ZGExMDA0eF9lbmNvZGVfZmVjKGZlX3BhcmFtcy0+dS5vZmRtLmNvZGVfcmF0ZV9MUCk7Ci0JCWlmICh0bXAgPCAwKSByZXR1cm4gdG1wOworCQlpZiAodG1wIDwgMCkKKwkJCXJldHVybiB0bXA7CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0lOX0NPTkYyLCAweDM4LCB0bXAgPDwgMyk7CiAKIAkJLy8gc2V0IGNvbnN0ZWxsYXRpb24KQEAgLTY3MSw3ICs3MDYsNyBAQAogCX0KIAogCS8vIHNldCBiYW5kd2lkdGgKLQlzd2l0Y2goc3RhdGUtPmRlbW9kX3R5cGUpIHsKKwlzd2l0Y2ggKHN0YXRlLT5kZW1vZF90eXBlKSB7CiAJY2FzZSBUREExMDA0WF9ERU1PRF9UREExMDA0NToKIAkJdGRhMTAwNDVoX3NldF9iYW5kd2lkdGgoc3RhdGUsIGZlX3BhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CiAJCWJyZWFrOwpAQCAtNjgzLDcgKzcxOCw4IEBACiAKIAkvLyBzZXQgaW52ZXJzaW9uCiAJaW52ZXJzaW9uID0gZmVfcGFyYW1zLT5pbnZlcnNpb247Ci0JaWYgKHN0YXRlLT5jb25maWctPmludmVydCkgaW52ZXJzaW9uID0gaW52ZXJzaW9uID8gSU5WRVJTSU9OX09GRiA6IElOVkVSU0lPTl9PTjsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0KQorCQlpbnZlcnNpb24gPSBpbnZlcnNpb24gPyBJTlZFUlNJT05fT0ZGIDogSU5WRVJTSU9OX09OOwogCXN3aXRjaCAoaW52ZXJzaW9uKSB7CiAJY2FzZSBJTlZFUlNJT05fT0ZGOgogCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzEsIDB4MjAsIDApOwpAQCAtNzUwLDE5ICs3ODYsMTkgQEAKIAl9CiAKIAkvLyBzdGFydCB0aGUgbG9jawotCXN3aXRjaChzdGF0ZS0+ZGVtb2RfdHlwZSkgeworCXN3aXRjaCAoc3RhdGUtPmRlbW9kX3R5cGUpIHsKIAljYXNlIFREQTEwMDRYX0RFTU9EX1REQTEwMDQ1OgogCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDgsIDgpOwogCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDgsIDApOwotCQltc2xlZXAoMTApOwogCQlicmVhazsKIAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0FVVE8sIDB4NDAsIDB4NDApOwotCQltc2xlZXAoMTApOwogCQlicmVhazsKIAl9CiAKKwltc2xlZXAoMTApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc3MywxMyArODA5LDEzIEBACiAKIAkvLyBpbnZlcnNpb24gc3RhdHVzCiAJZmVfcGFyYW1zLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwotCWlmICh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0NPTkZDMSkgJiAweDIwKSB7CisJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ09ORkMxKSAmIDB4MjApCiAJCWZlX3BhcmFtcy0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOwotCX0KLQlpZiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0KSBmZV9wYXJhbXMtPmludmVyc2lvbiA9IGZlX3BhcmFtcy0+aW52ZXJzaW9uID8gSU5WRVJTSU9OX09GRiA6IElOVkVSU0lPTl9PTjsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0KQorCQlmZV9wYXJhbXMtPmludmVyc2lvbiA9IGZlX3BhcmFtcy0+aW52ZXJzaW9uID8gSU5WRVJTSU9OX09GRiA6IElOVkVSU0lPTl9PTjsKIAogCS8vIGJhbmR3aWR0aAotCXN3aXRjaChzdGF0ZS0+ZGVtb2RfdHlwZSkgeworCXN3aXRjaCAoc3RhdGUtPmRlbW9kX3R5cGUpIHsKIAljYXNlIFREQTEwMDRYX0RFTU9EX1REQTEwMDQ1OgogCQlzd2l0Y2ggKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNDVIX1dSRUZfTFNCKSkgewogCQljYXNlIDB4MTQ6CkBAIC04MzAsOSArODY2LDggQEAKIAogCS8vIHRyYW5zbWlzc2lvbiBtb2RlCiAJZmVfcGFyYW1zLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKLQlpZiAodGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9PVVRfQ09ORjEpICYgMHgxMCkgeworCWlmICh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX09VVF9DT05GMSkgJiAweDEwKQogCQlmZV9wYXJhbXMtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9IFRSQU5TTUlTU0lPTl9NT0RFXzhLOwotCX0KIAogCS8vIGd1YXJkIGludGVydmFsCiAJc3dpdGNoICgodGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9PVVRfQ09ORjEpICYgMHgwYykgPj4gMikgewpAQCAtODgwLDMwICs5MTUsMzMgQEAKIAogCS8vIHJlYWQgc3RhdHVzCiAJc3RhdHVzID0gdGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9TVEFUVVNfQ0QpOwotCWlmIChzdGF0dXMgPT0gLTEpIHsKKwlpZiAoc3RhdHVzID09IC0xKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAkvLyBkZWNvZGUKIAkqZmVfc3RhdHVzID0gMDsKLQlpZiAoc3RhdHVzICYgNCkgKmZlX3N0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOwotCWlmIChzdGF0dXMgJiAyKSAqZmVfc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOwotCWlmIChzdGF0dXMgJiA4KSAqZmVfc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKwlpZiAoc3RhdHVzICYgNCkKKwkJKmZlX3N0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCWlmIChzdGF0dXMgJiAyKQorCQkqZmVfc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChzdGF0dXMgJiA4KQorCQkqZmVfc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKIAogCS8vIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBWSVRFUkJJIChpLmUuIG5vdCBMT0NLRUQpLCBzZWUgaWYgdGhlIHZpdGVyYmkKIAkvLyBpcyBnZXR0aW5nIGFueXRoaW5nIHZhbGlkCiAJaWYgKCEoKmZlX3N0YXR1cyAmIEZFX0hBU19WSVRFUkJJKSkgewogCQkvLyByZWFkIHRoZSBDQkVSCiAJCWNiZXIgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0NCRVJfTFNCKTsKLQkJaWYgKGNiZXIgPT0gLTEpIHJldHVybiAtRUlPOworCQlpZiAoY2JlciA9PSAtMSkKKwkJCXJldHVybiAtRUlPOwogCQlzdGF0dXMgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0NCRVJfTVNCKTsKLQkJaWYgKHN0YXR1cyA9PSAtMSkgcmV0dXJuIC1FSU87CisJCWlmIChzdGF0dXMgPT0gLTEpCisJCQlyZXR1cm4gLUVJTzsKIAkJY2JlciB8PSAoc3RhdHVzIDw8IDgpOwogCQl0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0NCRVJfUkVTRVQpOwogCi0JCWlmIChjYmVyICE9IDY1NTM1KSB7CisJCWlmIChjYmVyICE9IDY1NTM1KQogCQkJKmZlX3N0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKLQkJfQogCX0KIAogCS8vIGlmIHdlIERPIGhhdmUgc29tZSB2YWxpZCBWSVRFUkJJIG91dHB1dCwgYnV0IGRvbid0IGFscmVhZHkgaGF2ZSBTWU5DCkBAIC05MTEsMjAgKzk0OSwyMiBAQAogCWlmICgoKmZlX3N0YXR1cyAmIEZFX0hBU19WSVRFUkJJKSAmJiAoISgqZmVfc3RhdHVzICYgRkVfSEFTX1NZTkMpKSkgewogCQkvLyByZWFkIHRoZSBWQkVSCiAJCXZiZXIgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1ZCRVJfTFNCKTsKLQkJaWYgKHZiZXIgPT0gLTEpIHJldHVybiAtRUlPOworCQlpZiAodmJlciA9PSAtMSkKKwkJCXJldHVybiAtRUlPOwogCQlzdGF0dXMgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1ZCRVJfTUlEKTsKLQkJaWYgKHN0YXR1cyA9PSAtMSkgcmV0dXJuIC1FSU87CisJCWlmIChzdGF0dXMgPT0gLTEpCisJCQlyZXR1cm4gLUVJTzsKIAkJdmJlciB8PSAoc3RhdHVzIDw8IDgpOwogCQlzdGF0dXMgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1ZCRVJfTVNCKTsKLQkJaWYgKHN0YXR1cyA9PSAtMSkgcmV0dXJuIC1FSU87CisJCWlmIChzdGF0dXMgPT0gLTEpCisJCQlyZXR1cm4gLUVJTzsKIAkJdmJlciB8PSAoKHN0YXR1cyA8PCAxNikgJiAweDBmKTsKIAkJdGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9DVkJFUl9MVVQpOwogCiAJCS8vIGlmIFJTIGhhcyBwYXNzZWQgc29tZSB2YWxpZCBUUyBwYWNrZXRzLCB0aGVuIHdlIG11c3QgYmUKIAkJLy8gZ2V0dGluZyBzb21lIFNZTkMgYnl0ZXMKLQkJaWYgKHZiZXIgPCAxNjYzMikgeworCQlpZiAodmJlciA8IDE2NjMyKQogCQkJKmZlX3N0YXR1cyB8PSBGRV9IQVNfU1lOQzsKLQkJfQogCX0KIAogCS8vIHN1Y2Nlc3MKQEAgLTk0MSw3ICs5ODEsNyBAQAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJLy8gZGV0ZXJtaW5lIHRoZSByZWdpc3RlciB0byB1c2UKLQlzd2l0Y2goc3RhdGUtPmRlbW9kX3R5cGUpIHsKKwlzd2l0Y2ggKHN0YXRlLT5kZW1vZF90eXBlKSB7CiAJY2FzZSBUREExMDA0WF9ERU1PRF9UREExMDA0NToKIAkJcmVnID0gVERBMTAwNDVIX1NfQUdDOwogCQlicmVhazsKQEAgLTk3Miw5ICsxMDEyLDggQEAKIAl0bXAgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1NOUik7CiAJaWYgKHRtcCA8IDApCiAJCXJldHVybiAtRUlPOwotCWlmICh0bXApIHsKKwlpZiAodG1wKQogCQl0bXAgPSAyNTUgLSB0bXA7Ci0JfQogCiAJKnNuciA9ICgodG1wIDw8IDgpIHwgdG1wKTsKIAlkcHJpbnRrKCIlczogc25yPTB4JXhcbiIsIF9fRlVOQ1RJT05fXywgKnNucik7CkBAIC0xMDA5LDExICsxMDQ4LDExIEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAodG1wICE9IDB4N2YpIHsKKwlpZiAodG1wICE9IDB4N2YpCiAJCSp1Y2Jsb2NrcyA9IHRtcDsKLQl9IGVsc2UgeworCWVsc2UKIAkJKnVjYmxvY2tzID0gMHhmZmZmZmZmZjsKLQl9CisKIAlkcHJpbnRrKCIlczogdWNibG9ja3M9MHgleFxuIiwgX19GVU5DVElPTl9fLCAqdWNibG9ja3MpOwogCXJldHVybiAwOwogfQpAQCAtMTAyNywxMCArMTA2NiwxMiBAQAogCiAJLy8gcmVhZCBpdCBpbgogCXRtcCA9IHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0JFUl9MU0IpOwotCWlmICh0bXAgPCAwKSByZXR1cm4gLUVJTzsKKwlpZiAodG1wIDwgMCkKKwkJcmV0dXJuIC1FSU87CiAJKmJlciA9IHRtcCA8PCAxOwogCXRtcCA9IHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0JFUl9NU0IpOwotCWlmICh0bXAgPCAwKSByZXR1cm4gLUVJTzsKKwlpZiAodG1wIDwgMCkKKwkJcmV0dXJuIC1FSU87CiAJKmJlciB8PSAodG1wIDw8IDkpOwogCXRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0JFUl9SRVNFVCk7CiAKQEAgLTEwNDIsNyArMTA4Myw3IEBACiB7CiAJc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0Jc3dpdGNoKHN0YXRlLT5kZW1vZF90eXBlKSB7CisJc3dpdGNoIChzdGF0ZS0+ZGVtb2RfdHlwZSkgewogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDU6CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZBREMxLCAweDEwLCAweDEwKTsKIAkJYnJlYWs7CkBAIC0xMDY2LDc0ICsxMTA3LDExIEBACiAKIHN0YXRpYyB2b2lkIHRkYTEwMDR4X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdGRhMTAwNDVfb3BzOwotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGExMDA0NV9hdHRhY2goY29uc3Qgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyogY29uZmlnLAotCQkJCSAgICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpCi17Ci0Jc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IE5VTEw7Ci0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwotCi0JLyogc2V0dXAgdGhlIHN0YXRlICovCi0Jc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKLQlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ1X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7Ci0Jc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKLQlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ1OwotCi0JLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCi0JaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDI1KSBnb3RvIGVycm9yOwotCi0JLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKLQlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwotCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwotCi1lcnJvcjoKLQlrZnJlZShzdGF0ZSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB0ZGExMDA0Nl9vcHM7Ci0KLXN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDQ2X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWcsCi0JCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKLXsKLQlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUqIHN0YXRlID0gTlVMTDsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHRkYTEwMDR4X3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHRkYTEwMDR4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0KLQkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KLQlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwotCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdGRhMTAwNDZfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKLQlzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOwotCXN0YXRlLT5kZW1vZF90eXBlID0gVERBMTAwNFhfREVNT0RfVERBMTAwNDY7Ci0KLQkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KLQlpZiAodGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9DSElQSUQpICE9IDB4NDYpIGdvdG8gZXJyb3I7Ci0KLQkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwotCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7Ci0JcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7Ci0KLWVycm9yOgotCWlmIChzdGF0ZSkga2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdGRhMTAwNDVfb3BzID0gewotCiAJLmluZm8gPSB7CiAJCS5uYW1lID0gIlBoaWxpcHMgVERBMTAwNDVIIERWQi1UIiwKIAkJLnR5cGUgPSBGRV9PRkRNLApAQCAtMTE2Myw4ICsxMTQxLDM2IEBACiAJLnJlYWRfdWNibG9ja3MgPSB0ZGExMDA0eF9yZWFkX3VjYmxvY2tzLAogfTsKIAotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHRkYTEwMDQ2X29wcyA9IHsKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDQ1X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWcsCisJCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlOwogCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmICghc3RhdGUpCisJCXJldHVybiBOVUxMOworCisJLyogc2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ1X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKKwlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ1OworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDI1KSB7CisJCWtmcmVlKHN0YXRlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdGRhMTAwNDZfb3BzID0gewogCS5pbmZvID0gewogCQkubmFtZSA9ICJQaGlsaXBzIFREQTEwMDQ2SCBEVkItVCIsCiAJCS50eXBlID0gRkVfT0ZETSwKQEAgLTExOTQsNiArMTIwMCwzNiBAQAogCS5yZWFkX3VjYmxvY2tzID0gdGRhMTAwNHhfcmVhZF91Y2Jsb2NrcywKIH07CiAKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDQ2X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWcsCisJCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmICghc3RhdGUpCisJCXJldHVybiBOVUxMOworCisJLyogc2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKKwlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OworCXN0YXRlLT5md192ZXJzaW9uID0gMHgyMDsJLyogZHVtbXkgZGVmYXVsdCB2YWx1ZSAqLworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDQ2KSB7CisJCWtmcmVlKHN0YXRlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworfQorCiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKaW5kZXggZTQ1MmZjMC4uYzhlMWQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKQEAgLTMyLDEwICszMiwxMyBAQAogCXU4IGRlbW9kX2FkZHJlc3M7CiAKIAkvKiBkb2VzIHRoZSAiaW52ZXJzaW9uIiBuZWVkIGludmVydGVkPyAqLwotCXU4IGludmVydDoxOworCXU4IGludmVydDsKIAogCS8qIERvZXMgdGhlIE9DTEsgc2lnbmFsIG5lZWQgaW52ZXJ0ZWQ/ICovCi0JdTggaW52ZXJ0X29jbGs6MTsKKwl1OCBpbnZlcnRfb2NsazsKKworCS8qIHZhbHVlIG9mIE5fSTJDIG9mIHRoZSBDT05GX1BMTDMgcmVnaXN0ZXIgKi8KKwl1OCBuX2kyYzsKIAogCS8qIFBMTCBtYWludGVuYW5jZSAqLwogCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYwppbmRleCBkYTgyZTkwLi4xNjhlMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogc3RhdGljIGludCB0ZGE4MDgzX3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJICAgIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKm0pCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAKIAl0ZGE4MDgzX3dyaXRlcmVnIChzdGF0ZSwgMHgyOSwgKG0tPm1zZ19sZW4gLSAzKSB8ICgxIDw8IDIpKTsgLyogZW5hYmxlICovCkBAIC0yNDMsNyArMjQzLDcgQEAKIAogc3RhdGljIGludCB0ZGE4MDgzX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewotCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODA4M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggc2lnbmFsID0gfnRkYTgwODNfcmVhZHJlZyAoc3RhdGUsIDB4MDEpOwogCXU4IHN5bmMgPSB0ZGE4MDgzX3JlYWRyZWcgKHN0YXRlLCAweDAyKTsKQEAgLTI3MCw3ICsyNzAsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgwODNfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1OCBzaWduYWwgPSB+dGRhODA4M19yZWFkcmVnIChzdGF0ZSwgMHgwMSk7CiAJKnN0cmVuZ3RoID0gKHNpZ25hbCA8PCA4KSB8IHNpZ25hbDsKQEAgLTI4MCw3ICsyODAsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgwODNfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODA4M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggX3NuciA9IHRkYTgwODNfcmVhZHJlZyAoc3RhdGUsIDB4MDgpOwogCSpzbnIgPSAoX3NuciA8PCA4KSB8IF9zbnI7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAogc3RhdGljIGludCB0ZGE4MDgzX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODA4M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CiAJdGRhODA4M19zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKQEAgLTMwNSw3ICszMDUsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgwODNfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiAgRklYTUU6IGdldCBzeW1ib2xyYXRlICYgZnJlcXVlbmN5IG9mZnNldC4uLiovCiAJLypwLT5mcmVxdWVuY3kgPSA/Pz87Ki8KQEAgLTMxOSw3ICszMTksNyBAQAogCiBzdGF0aWMgaW50IHRkYTgwODNfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl0ZGE4MDgzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMik7CiAJcmV0dXJuIDA7CkBAIC0zMjcsNyArMzI3LDcgQEAKIAogc3RhdGljIGludCB0ZGE4MDgzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAKIAlmb3IgKGk9MDsgaTw0NDsgaSsrKQpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODA4M19kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl0ZGE4MDgzX3NlbmRfZGlzZXFjX2J1cnN0IChzdGF0ZSwgYnVyc3QpOwogCXRkYTgwODNfd3JpdGVyZWcgKHN0YXRlLCAweDAwLCAweDNjKTsKQEAgLTM1NCw3ICszNTQsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgwODNfZGlzZXFjX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKLQlzdHJ1Y3QgdGRhODA4M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgwODNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODA4M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXRkYTgwODNfc2V0X3RvbmUgKHN0YXRlLCB0b25lKTsKIAl0ZGE4MDgzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgzYyk7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAogc3RhdGljIGludCB0ZGE4MDgzX2Rpc2VxY19zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQogewotCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODA4M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdGRhODA4M19zZXRfdm9sdGFnZSAoc3RhdGUsIHZvbHRhZ2UpOwogCXRkYTgwODNfd3JpdGVyZWcgKHN0YXRlLCAweDAwLCAweDNjKTsKQEAgLTM3Niw3ICszNzYsNyBAQAogCiBzdGF0aWMgdm9pZCB0ZGE4MDgzX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC0zODgsNyArMzg4LDcgQEAKIAlzdHJ1Y3QgdGRhODA4M19zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgdGRhODA4M19zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGE4MDgzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhODA4M19zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODB4eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgweHguYwppbmRleCBjOTk2MzIxLi4wMzJkMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDAwLDcgKzQwMCw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODA0NF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODB4eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXQ7CiAKIAkvKgpAQCAtNDMyLDcgKzQzMiw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODA4M19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODB4eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdGRhODB4eF93cml0ZShzdGF0ZSwgMHgwMCwgdGRhODA4M19pbml0dGFiLCBzaXplb2YodGRhODA4M19pbml0dGFiKSk7CiAKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgweHhfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN3aXRjaCAodm9sdGFnZSkgewogCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CkBAIC00NjMsNyArNDYzLDcgQEAKIAogc3RhdGljIGludCB0ZGE4MHh4X3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN3aXRjaCAodG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT0ZGOgpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODB4eF9zZW5kX2Rpc2VxY19tc2coc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWlmIChjbWQtPm1zZ19sZW4gPiA2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgweHhfc2VuZF9kaXNlcWNfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IGNtZCkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTRUNfTUlOSV9BOgpAQCAtNTEyLDcgKzUxMiw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODB4eF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXRkYTgweHhfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MDIpOwkvKiBlbnRlciBzdGFuZGJ5ICovCiAKQEAgLTUyMSw3ICs1MjEsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgweHhfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MHh4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl0ZGE4MHh4X3dyaXRlcmVnKHN0YXRlLCAweDFjLCAweDgwKTsKIAlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKQEAgLTUzNyw3ICs1MzcsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgweHhfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MHh4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlpZiAoIXN0YXRlLT5jb25maWctPmlycSkKIAkJdGRhODB4eF9yZWFkX3N0YXR1c19pbnQoc3RhdGUpOwpAQCAtNTUwLDcgKzU1MCw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODB4eF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWlmICghc3RhdGUtPmNvbmZpZy0+aXJxKQogCQl0ZGE4MHh4X3JlYWRfc3RhdHVzX2ludChzdGF0ZSk7CkBAIC01NjEsNyArNTYxLDcgQEAKIAogc3RhdGljIGludCB0ZGE4MHh4X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmV0OwogCXU4IGJ1ZlszXTsKIApAQCAtNTc1LDcgKzU3NSw3IEBACiAKIHN0YXRpYyBpbnQgdGRhODB4eF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IGdhaW4gPSB+dGRhODB4eF9yZWFkcmVnKHN0YXRlLCAweDAxKTsKIAkqc3RyZW5ndGggPSAoZ2FpbiA8PCA4KSB8IGdhaW47CkBAIC01ODUsNyArNTg1LDcgQEAKIAogc3RhdGljIGludCB0ZGE4MHh4X3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IHF1YWxpdHkgPSB0ZGE4MHh4X3JlYWRyZWcoc3RhdGUsIDB4MDgpOwogCSpzbnIgPSAocXVhbGl0eSA8PCA4KSB8IHF1YWxpdHk7CkBAIC01OTUsNyArNTk1LDcgQEAKIAogc3RhdGljIGludCB0ZGE4MHh4X3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCiB7Ci0Jc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0ZGE4MHh4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTgweHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqdWNibG9ja3MgPSB0ZGE4MHh4X3JlYWRyZWcoc3RhdGUsIDB4MGYpOwogCWlmICgqdWNibG9ja3MgPT0gMHhmZikKQEAgLTYwNiw3ICs2MDYsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgweHhfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhODB4eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN3aXRjaChzdGF0ZS0+aWQpIHsKIAljYXNlIElEX1REQTgwNDQ6CkBAIC02MjAsNyArNjIwLDcgQEAKIAogc3RhdGljIHZvaWQgdGRhODB4eF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdGRhODB4eF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGE4MHh4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJaWYgKHN0YXRlLT5jb25maWctPmlycSkKIAkJZnJlZV9pcnEoc3RhdGUtPmNvbmZpZy0+aXJxLCAmc3RhdGUtPndvcmtsZXQpOwpAQCAtNjM3LDcgKzYzNyw3IEBACiAJaW50IHJldDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHRkYTgweHhfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhODB4eF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRkYTgweHhfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKaW5kZXggOWMwZDIzZS4uNzBmYjQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jCkBAIC03MCw3ICs3MCw2IEBACiAJCXByaW50aygidmVzMTgyMDogJXMoKTogd3JpdGVyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIgogCQkJInZhbCA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCBkYXRhLCByZXQpOwogCi0JbXNsZWVwKDEwKTsKIAlyZXR1cm4gKHJldCAhPSAxKSA/IC1FUkVNT1RFSU8gOiAwOwogfQogCkBAIC0xOTMsNyArMTkyLDcgQEAKIAogc3RhdGljIGludCB2ZXMxODIwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxODIwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAJaW50IHZhbDsKIApAQCAtMjE0LDcgKzIxMyw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMTgyMF9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXN0YXRpYyBjb25zdCB1OCByZWcweDAwW10gPSB7IDB4MDAsIDB4MDQsIDB4MDgsIDB4MGMsIDB4MTAgfTsKIAlzdGF0aWMgY29uc3QgdTggcmVnMHgwMVtdID0geyAxNDAsIDE0MCwgMTA2LCAxMDAsIDkyIH07CiAJc3RhdGljIGNvbnN0IHU4IHJlZzB4MDVbXSA9IHsgMTM1LCAxMDAsIDcwLCA1NCwgMzggfTsKQEAgLTI0MSw3ICsyNDAsNyBAQAogCiBzdGF0aWMgaW50IHZlczE4MjBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCiB7Ci0Jc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxODIwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHN5bmM7CiAKIAkqc3RhdHVzID0gMDsKQEAgLTI2Nyw3ICsyNjYsNyBAQAogCiBzdGF0aWMgaW50IHZlczE4MjBfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKQogewotCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTMyIF9iZXIgPSB2ZXMxODIwX3JlYWRyZWcoc3RhdGUsIDB4MTQpIHwKIAkJCSh2ZXMxODIwX3JlYWRyZWcoc3RhdGUsIDB4MTUpIDw8IDgpIHwKQEAgLTI3OSw3ICsyNzgsNyBAQAogCiBzdGF0aWMgaW50IHZlczE4MjBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxODIwX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAl1OCBnYWluID0gdmVzMTgyMF9yZWFkcmVnKHN0YXRlLCAweDE3KTsKIAkqc3RyZW5ndGggPSAoZ2FpbiA8PCA4KSB8IGdhaW47CkBAIC0yODksNyArMjg4LDcgQEAKIAogc3RhdGljIGludCB2ZXMxODIwX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczE4MjBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IHF1YWxpdHkgPSB+dmVzMTgyMF9yZWFkcmVnKHN0YXRlLCAweDE4KTsKIAkqc25yID0gKHF1YWxpdHkgPDwgOCkgfCBxdWFsaXR5OwpAQCAtMjk5LDcgKzI5OCw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMTgyMF9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQogewotCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnVjYmxvY2tzID0gdmVzMTgyMF9yZWFkcmVnKHN0YXRlLCAweDEzKSAmIDB4N2Y7CiAJaWYgKCp1Y2Jsb2NrcyA9PSAweDdmKQpAQCAtMzE0LDcgKzMxMyw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMTgyMF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczE4MjBfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgc3luYzsKIAlzOCBhZmMgPSAwOwogCkBAIC0zNDUsNyArMzQ0LDcgQEAKIAogc3RhdGljIGludCB2ZXMxODIwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgMHgxYiwgMHgwMik7CS8qIHBkb3duIEFEQyAqLwogCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4ODApOwkvKiBzdGFuZGJ5ICovCkBAIC0zNjQsNyArMzYzLDcgQEAKIAogc3RhdGljIHZvaWQgdmVzMTgyMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtMzc3LDcgKzM3Niw3IEBACiAJc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHZlczE4MjBfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZlczE4MjBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmMKaW5kZXggZWRjYWQyOC4uODIxZGY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAogc3RhdGljIGludCB2ZXMxeDkzX2luaXQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotCXN0cnVjdCB2ZXMxeDkzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMXg5M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxeDkzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBpOwogCWludCB2YWw7CiAKQEAgLTI4OSw3ICsyODksNyBAQAogCiBzdGF0aWMgaW50IHZlczF4OTNfc2V0X3ZvbHRhZ2UgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCiB7Ci0Jc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxeDkzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzd2l0Y2ggKHZvbHRhZ2UpIHsKIAljYXNlIFNFQ19WT0xUQUdFXzEzOgpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMXg5M19yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IHN5bmMgPSB2ZXMxeDkzX3JlYWRyZWcgKHN0YXRlLCAweDBlKTsKIApAQCAtMzQ2LDcgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMXg5M19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCiB7Ci0Jc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxeDkzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqYmVyID0gdmVzMXg5M19yZWFkcmVnIChzdGF0ZSwgMHgxNSk7CiAJKmJlciB8PSAodmVzMXg5M19yZWFkcmVnIChzdGF0ZSwgMHgxNikgPDwgOCk7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAogc3RhdGljIGludCB2ZXMxeDkzX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQogewotCXN0cnVjdCB2ZXMxeDkzX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgdmVzMXg5M19zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB2ZXMxeDkzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJdTggc2lnbmFsID0gfnZlczF4OTNfcmVhZHJlZyAoc3RhdGUsIDB4MGIpOwogCSpzdHJlbmd0aCA9IChzaWduYWwgPDwgOCkgfCBzaWduYWw7CkBAIC0zNjgsNyArMzY4LDcgQEAKIAogc3RhdGljIGludCB2ZXMxeDkzX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKIHsKLQlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXU4IF9zbnIgPSB+dmVzMXg5M19yZWFkcmVnIChzdGF0ZSwgMHgxYyk7CiAJKnNuciA9IChfc25yIDw8IDgpIHwgX3NucjsKQEAgLTM3OCw3ICszNzgsNyBAQAogCiBzdGF0aWMgaW50IHZlczF4OTNfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKIHsKLQlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCSp1Y2Jsb2NrcyA9IHZlczF4OTNfcmVhZHJlZyAoc3RhdGUsIDB4MTgpICYgMHg3ZjsKIApAQCAtMzkzLDcgKzM5Myw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMXg5M19zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXZlczF4OTNfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MTEpOwogCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAKIHN0YXRpYyBpbnQgdmVzMXg5M19nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgYWZjOwogCiAJYWZjID0gKChpbnQpKChjaGFyKSh2ZXMxeDkzX3JlYWRyZWcgKHN0YXRlLCAweDBhKSA8PCAxKSkpLzI7CkBAIC00MzEsMTQgKzQzMSwxNCBAQAogCiBzdGF0aWMgaW50IHZlczF4OTNfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxeDkzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlyZXR1cm4gdmVzMXg5M193cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4MDgpOwogfQogCiBzdGF0aWMgdm9pZCB2ZXMxeDkzX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0Jc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB2ZXMxeDkzX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHZlczF4OTNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC00NTEsNyArNDUxLDcgQEAKIAl1OCBpZGVudGl0eTsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHZlczF4OTNfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVzMXg5M19zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZlczF4OTNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwppbmRleCA5MjJjMjA1Li44ZTMzYTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJYXY3MTEwLT5jdXJyZW50X2lucHV0ID0gMDsKIAlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMCwgMHgwMCkgPT0gMSkgewogCQlwcmludGsgKCJkdmItdHRwY2k6IENyeXN0YWwgYXVkaW8gREFDIEAgY2FyZCAlZCBkZXRlY3RlZFxuIiwKLQkJCWF2NzExMC0+ZHZiX2FkYXB0ZXItPm51bSk7CisJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfQ1JZU1RBTDsKIAkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMSwgMHhkMik7CiAJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOwpAQCAtMTQ1LDEzICsxNDUsMTMgQEAKIAl9CiAJZWxzZSBpZiAoZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMTBhKSB7CiAJCXByaW50aygiZHZiLXR0cGNpOiBEVkItQyB3L28gYW5hbG9nIG1vZHVsZSBAIGNhcmQgJWQgZGV0ZWN0ZWRcbiIsCi0JCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0pOworCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX05PTkU7CiAJfQogCWVsc2UgewogCQlhdjcxMTAtPmFkYWNfdHlwZSA9IGFkYWM7CiAJCXByaW50aygiZHZiLXR0cGNpOiBhZGFjIHR5cGUgc2V0IHRvICVkIEAgY2FyZCAlZFxuIiwKLQkJCWF2NzExMC0+ZHZiX2FkYXB0ZXItPm51bSwgYXY3MTEwLT5hZGFjX3R5cGUpOworCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0sIGF2NzExMC0+YWRhY190eXBlKTsKIAl9CiAKIAlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTk9ORSB8fCBhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19NU1ApIHsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCiAJCWlmIChuZXdsb29wcyA9PSBhdjcxMTAtPmFybV9sb29wcykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IEFSTSBjcmFzaGVkIEAgY2FyZCAlZFxuIiwKLQkJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0pOworCQkJICAgICAgIGF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKIAogCQkJYXJtX2Vycm9yKGF2NzExMCk7CiAJCQlhdjc3MTBfc2V0X3ZpZGVvX21vZGUoYXY3MTEwLCB2aWRtb2RlKTsKQEAgLTEyODIsNyArMTI4Miw3IEBACiAJYXY3MTEwLT5kbXhkZXYuZGVtdXggPSAmZHZiZGVtdXgtPmRteDsKIAlhdjcxMTAtPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwogCi0JZHZiX2RteGRldl9pbml0KCZhdjcxMTAtPmRteGRldiwgYXY3MTEwLT5kdmJfYWRhcHRlcik7CisJZHZiX2RteGRldl9pbml0KCZhdjcxMTAtPmRteGRldiwgJmF2NzExMC0+ZHZiX2FkYXB0ZXIpOwogCiAJYXY3MTEwLT5od19mcm9udGVuZC5zb3VyY2UgPSBETVhfRlJPTlRFTkRfMDsKIApAQCAtMTMwNywxMSArMTMwNywxMSBAQAogCWF2NzExMF9jYV9yZWdpc3RlcihhdjcxMTApOwogCiAjaWZkZWYgQ09ORklHX0RWQl9BVjcxMTBfT1NECi0JZHZiX3JlZ2lzdGVyX2RldmljZShhdjcxMTAtPmR2Yl9hZGFwdGVyLCAmYXY3MTEwLT5vc2RfZGV2LAorCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoJmF2NzExMC0+ZHZiX2FkYXB0ZXIsICZhdjcxMTAtPm9zZF9kZXYsCiAJCQkgICAgJmR2YmRldl9vc2QsIGF2NzExMCwgRFZCX0RFVklDRV9PU0QpOwogI2VuZGlmCiAKLQlkdmJfbmV0X2luaXQoYXY3MTEwLT5kdmJfYWRhcHRlciwgJmF2NzExMC0+ZHZiX25ldCwgJmR2YmRlbXV4LT5kbXgpOworCWR2Yl9uZXRfaW5pdCgmYXY3MTEwLT5kdmJfYWRhcHRlciwgJmF2NzExMC0+ZHZiX25ldCwgJmR2YmRlbXV4LT5kbXgpOwogCiAJaWYgKGJ1ZGdldHBhdGNoKSB7CiAJCS8qIGluaXRpYWxpemUgc29mdHdhcmUgZGVtdXgxIHdpdGhvdXQgaXRzIG93biBmcm9udGVuZApAQCAtMTMzNCw5ICsxMzM0LDkgQEAKIAkJYXY3MTEwLT5kbXhkZXYxLmRlbXV4ID0gJmR2YmRlbXV4MS0+ZG14OwogCQlhdjcxMTAtPmRteGRldjEuY2FwYWJpbGl0aWVzID0gMDsKIAotCQlkdmJfZG14ZGV2X2luaXQoJmF2NzExMC0+ZG14ZGV2MSwgYXY3MTEwLT5kdmJfYWRhcHRlcik7CisJCWR2Yl9kbXhkZXZfaW5pdCgmYXY3MTEwLT5kbXhkZXYxLCAmYXY3MTEwLT5kdmJfYWRhcHRlcik7CiAKLQkJZHZiX25ldF9pbml0KGF2NzExMC0+ZHZiX2FkYXB0ZXIsICZhdjcxMTAtPmR2Yl9uZXQxLCAmZHZiZGVtdXgxLT5kbXgpOworCQlkdmJfbmV0X2luaXQoJmF2NzExMC0+ZHZiX2FkYXB0ZXIsICZhdjcxMTAtPmR2Yl9uZXQxLCAmZHZiZGVtdXgxLT5kbXgpOwogCQlwcmludGsoImR2Yi10dHBjaTogYWRkaXRpb25hbCBkZW11eDEgZm9yIGJ1ZGdldC1wYXRjaCByZWdpc3RlcmVkXG4iKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjczLDYgKzE2NzMsMTA2IEBACiB9OwogCiAKK3N0YXRpYyB1OCBhbHBzX2JzYmUxX2luaXR0YWJbXSA9IHsKKwkweDAxLCAweDE1LAorCTB4MDIsIDB4MzAsCisJMHgwMywgMHgwMCwKKwkweDA0LCAweDdkLCAgIC8qIEYyMkZSID0gMHg3ZCwgRjIyID0gZl9WQ08gLyAxMjggLyAweDdkID0gMjIga0h6ICovCisJMHgwNSwgMHgzNSwgICAvKiBJMkNUID0gMCwgU0NMVCA9IDEsIFNEQVQgPSAxICovCisJMHgwNiwgMHg0MCwgICAvKiBEQUMgbm90IHVzZWQsIHNldCB0byBoaWdoIGltcGVuZGFuY2UgbW9kZSAqLworCTB4MDcsIDB4MDAsICAgLyogREFDIExTQiAqLworCTB4MDgsIDB4NDAsICAgLyogRGlTRXFDIG9mZiwgTE5CIHBvd2VyIG9uIE9QMi9MT0NLIHBpbiBvbiAqLworCTB4MDksIDB4MDAsICAgLyogRklGTyAqLworCTB4MGMsIDB4NTEsICAgLyogT1AxIGN0bCA9IE5vcm1hbCwgT1AxIHZhbCA9IDEgKExOQiBQb3dlciBPTikgKi8KKwkweDBkLCAweDgyLCAgIC8qIERDIG9mZnNldCBjb21wZW5zYXRpb24gPSBPTiwgYmV0YV9hZ2MxID0gMiAqLworCTB4MGUsIDB4MjMsICAgLyogYWxwaGFfdG1nID0gMiwgYmV0YV90bWcgPSAzICovCisJMHgxMCwgMHgzZiwgICAvLyBBR0MyICAweDNkCisJMHgxMSwgMHg4NCwKKwkweDEyLCAweGI1LCAgIC8vIExvY2sgZGV0ZWN0OiAtNjQgIENhcnJpZXIgZnJlcSBkZXRlY3Q6b24KKwkweDE1LCAweGM5LCAgIC8vIGxvY2sgZGV0ZWN0b3IgdGhyZXNob2xkCisJMHgxNiwgMHgwMCwKKwkweDE3LCAweDAwLAorCTB4MTgsIDB4MDAsCisJMHgxOSwgMHgwMCwKKwkweDFhLCAweDAwLAorCTB4MWYsIDB4NTAsCisJMHgyMCwgMHgwMCwKKwkweDIxLCAweDAwLAorCTB4MjIsIDB4MDAsCisJMHgyMywgMHgwMCwKKwkweDI4LCAweDAwLCAgLy8gb3V0IGltcDogbm9ybWFsICBvdXQgdHlwZTogcGFyYWxsZWwgRkVDIG1vZGU6MAorCTB4MjksIDB4MWUsICAvLyAxLzIgdGhyZXNob2xkCisJMHgyYSwgMHgxNCwgIC8vIDIvMyB0aHJlc2hvbGQKKwkweDJiLCAweDBmLCAgLy8gMy80IHRocmVzaG9sZAorCTB4MmMsIDB4MDksICAvLyA1LzYgdGhyZXNob2xkCisJMHgyZCwgMHgwNSwgIC8vIDcvOCB0aHJlc2hvbGQKKwkweDJlLCAweDAxLAorCTB4MzEsIDB4MWYsICAvLyB0ZXN0IGFsbCBGRUNzCisJMHgzMiwgMHgxOSwgIC8vIHZpdGVyYmkgYW5kIHN5bmNocm8gc2VhcmNoCisJMHgzMywgMHhmYywgIC8vIHJzIGNvbnRyb2wKKwkweDM0LCAweDkzLCAgLy8gZXJyb3IgY29udHJvbAorCTB4MGYsIDB4OTIsCisJMHhmZiwgMHhmZgorfTsKKworc3RhdGljIGludCBhbHBzX2JzYmUxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQoreworCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwKikgZmUtPmR2Yi0+cHJpdjsKKwlpbnQgcmV0OworCXU4IGRhdGFbNF07CisJdTMyIGRpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSkgfTsKKworCWlmICgocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdiA9IChwYXJhbXMtPmZyZXF1ZW5jeSArICgxMjUgLSAxKSkgLyAxMjU7IC8vIHJvdW5kIGNvcnJlY3RseQorCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHg4MCB8ICgoZGl2ICYgMHgxODAwMCkgPj4gMTApIHwgNDsKKwlkYXRhWzNdID0gKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkgPyAweEUwIDogMHhFNDsKKworCXJldCA9IGkyY190cmFuc2ZlcigmYXY3MTEwLT5pMmNfYWRhcCwgJm1zZywgMSk7CisJcmV0dXJuIChyZXQgIT0gMSkgPyAtRUlPIDogMDsKK30KKworc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBhbHBzX2JzYmUxX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCisJLmluaXR0YWIgPSBhbHBzX2JzYmUxX2luaXR0YWIsCisJLm1jbGsgPSA4ODAwMDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5lbmhhbmNlZF90dW5pbmcgPSAwLAorCS5za2lwX3JlaW5pdCA9IDAsCisJLm1pbl9kZWxheV9tcyA9IDEwMCwKKwkuc2V0X3N5bWJvbF9yYXRlID0gYWxwc19ic3J1Nl9zZXRfc3ltYm9sX3JhdGUsCisJLnBsbF9zZXQgPSBhbHBzX2JzYmUxX3BsbF9zZXQsCit9OworCitzdGF0aWMgaW50IGxuYnAyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwKikgZmUtPmR2Yi0+cHJpdjsKKwlpbnQgcmV0OworCXU4IGRhdGFbMV07CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07CisKKwlzd2l0Y2godm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQlkYXRhWzBdID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJZGF0YVswXSA9IDB4NDQ7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCWRhdGFbMF0gPSAweDRjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwlyZXR1cm4gKHJldCAhPSAxKSA/IC1FSU8gOiAwOworfQorCiAKIHN0YXRpYyBpbnQgYWxwc190ZGJlMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKQEAgLTIxMTYsNiArMjIxNiwxNCBAQAogCQkJCWF2NzExMC0+ZGV2LT5pMmNfYml0cmF0ZSA9IFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV8yNDA7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MDAwRTogLyogSGF1cHBhdWdlL1RUIE5leHVzLVMgcmV2IDIuMyAqLworCQkJLyogQUxQUyBCU0JFMSAqLworCQkJYXY3MTEwLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZhbHBzX2JzYmUxX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOworCQkJaWYgKGF2NzExMC0+ZmUpCisJCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGxuYnAyMV9zZXRfdm9sdGFnZTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC0yMTM4LDcgKzIyNDYsNyBAQAogCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+ZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCwgYXY3MTEwLT5mZV9kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kLCBhdjcxMTBfZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCk7CiAJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5zZXRfZnJvbnRlbmQsIGF2NzExMC0+ZmVfc2V0X2Zyb250ZW5kLCBhdjcxMTBfZmVfc2V0X2Zyb250ZW5kKTsKIAotCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYXY3MTEwLT5kdmJfYWRhcHRlciwgYXY3MTEwLT5mZSk7CisJCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmYXY3MTEwLT5kdmJfYWRhcHRlciwgYXY3MTEwLT5mZSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoImF2NzExMDogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwogCQkJaWYgKGF2NzExMC0+ZmUtPm9wcy0+cmVsZWFzZSkKQEAgLTIzNTIsNyArMjQ2MCw3IEBACiAJCWdvdG8gZXJyX2R2Yl91bnJlZ2lzdGVyX2FkYXB0ZXJfMjsKIAogCXR0cGNpX2VlcHJvbV9wYXJzZV9tYWMoJmF2NzExMC0+aTJjX2FkYXAsCi0JCQkgICAgICAgYXY3MTEwLT5kdmJfYWRhcHRlci0+cHJvcG9zZWRfbWFjKTsKKwkJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLnByb3Bvc2VkX21hYyk7CiAJcmV0ID0gLUVOT01FTTsKIAogCWlmIChidWRnZXRwYXRjaCkgewpAQCAtMjUyMyw3ICsyNjMxLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfYXY3MTEwX3VucmVnaXN0ZXJfMTE7CiAKLQlhdjcxMTAtPmR2Yl9hZGFwdGVyLT5wcml2ID0gYXY3MTEwOworCWF2NzExMC0+ZHZiX2FkYXB0ZXIucHJpdiA9IGF2NzExMDsKIAlyZXQgPSBmcm9udGVuZF9pbml0KGF2NzExMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2F2NzExMF9leGl0X3Y0bF8xMjsKQEAgLTI1NTgsNyArMjY2Niw3IEBACiBlcnJfaTJjX2RlbF8zOgogCWkyY19kZWxfYWRhcHRlcigmYXY3MTEwLT5pMmNfYWRhcCk7CiBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcl8yOgotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoYXY3MTEwLT5kdmJfYWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmYXY3MTEwLT5kdmJfYWRhcHRlcik7CiBlcnJfcHV0X2Zpcm13YXJlXzE6CiAJcHV0X2Zpcm13YXJlKGF2NzExMCk7CiBlcnJfa2ZyZWVfMDoKQEAgLTI2MDQsNyArMjcxMiw3IEBACiAKIAlpMmNfZGVsX2FkYXB0ZXIoJmF2NzExMC0+aTJjX2FkYXApOwogCi0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlciAoYXY3MTEwLT5kdmJfYWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlciAoJmF2NzExMC0+ZHZiX2FkYXB0ZXIpOwogCiAJYXY3MTEwX251bS0tOwogCkBAIC0yNjcyLDIxICsyNzgwLDIzIEBACiBNQUtFX0FWNzExMF9JTkZPKHR0Y18xX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgTmV4dXMtQ0EgcmV2MS5YIik7CiBNQUtFX0FWNzExMF9JTkZPKHR0Y18yX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgRFZCLUMgcmV2Mi5YIik7CiBNQUtFX0FWNzExMF9JTkZPKHR0c18yX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgTmV4dXMtUyByZXYyLlgiKTsKK01BS0VfQVY3MTEwX0lORk8odHRzXzJfMywgICAgIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBOZXh1cy1TIHJldjIuMyIpOwogTUFLRV9BVjcxMTBfSU5GTyh0dHNfMV8zc2UsICAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIFdpblRWIERWQi1TIHJldjEuMyBTRSIpOwogTUFLRV9BVjcxMTBfSU5GTyh0dHQsICAgICAgICAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQi1UIik7CiBNQUtFX0FWNzExMF9JTkZPKGZzYywgICAgICAgICJGdWppdHN1IFNpZW1lbnMgRFZCLUMiKTsKIE1BS0VfQVY3MTEwX0lORk8oZnNzLCAgICAgICAgIkZ1aml0c3UgU2llbWVucyBEVkItUyByZXYxLjYiKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKKwlNQUtFX0VYVEVOU0lPTl9QQ0koZnNjLCAgICAgICAweDExMGEsIDB4MDAwMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKHR0c18xX1gsICAgMHgxM2MyLCAweDAwMDApLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dHRfMV9YLCAgIDB4MTNjMiwgMHgwMDAxKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRjXzJfWCwgICAweDEzYzIsIDB4MDAwMiksCiAJTUFLRV9FWFRFTlNJT05fUENJKHR0c18yX1gsICAgMHgxM2MyLCAweDAwMDMpLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMV8zc2UsIDB4MTNjMiwgMHgxMDAyKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0koZnNjLCAgICAgICAweDExMGEsIDB4MDAwMCksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0Y18xX1gsICAgMHgxM2MyLCAweDAwMGEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc3MsICAgICAgIDB4MTNjMiwgMHgwMDA2KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHR0LCAgICAgICAweDEzYzIsIDB4MDAwOCksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0Y18xX1gsICAgMHgxM2MyLCAweDAwMGEpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMl8zLCAgIDB4MTNjMiwgMHgwMDBlKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0kodHRzXzFfM3NlLCAweDEzYzIsIDB4MTAwMiksCiAKIC8qCU1BS0VfRVhURU5TSU9OX1BDSSg/Pz8sIDB4MTNjMiwgMHgwMDA0KSwgVU5ERUZJTkVEIENBUkQgKi8gLy8gR2FsYXhpcyBEVkIgUEMtU2F0LUNhcnRlCiAvKglNQUtFX0VYVEVOU0lPTl9QQ0koPz8/LCAweDEzYzIsIDB4MDAwNSksIFVOREVGSU5FRCBDQVJEICovIC8vIFRlY2huaXNhdCBTa3lTdGFyMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAppbmRleCA1MDcwZTA1Li40ZjY5YjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaApAQCAtMjIwLDcgKzIyMCw3IEBACiAKIAlzdHJ1Y3QgYXVkaW9fbWl4ZXIJbWl4ZXI7CiAKLQlzdHJ1Y3QgZHZiX2FkYXB0ZXIJICpkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIJIGR2Yl9hZGFwdGVyOwogCXN0cnVjdCBkdmJfZGV2aWNlCSAqdmlkZW9fZGV2OwogCXN0cnVjdCBkdmJfZGV2aWNlCSAqYXVkaW9fZGV2OwogCXN0cnVjdCBkdmJfZGV2aWNlCSAqY2FfZGV2OwpAQCAtMjc0LDcgKzI3NCw2IEBACiBleHRlcm4gaW50IGkyY193cml0ZXJlZyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGlkLCB1OCByZWcsIHU4IHZhbCk7CiBleHRlcm4gdTggaTJjX3JlYWRyZWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1OCBpZCwgdTggcmVnKTsKIGV4dGVybiBpbnQgbXNwX3dyaXRlcmVnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTggZGV2LCB1MTYgcmVnLCB1MTYgdmFsKTsKLWV4dGVybiBpbnQgbXNwX3JlYWRyZWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1OCBkZXYsIHUxNiByZWcsIHUxNiAqdmFsKTsKIAogCiBleHRlcm4gaW50IGF2NzExMF9pbml0X2FuYWxvZ19tb2R1bGUoc3RydWN0IGF2NzExMCAqYXY3MTEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggZDc3ZThhMC4uY2NmOTQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKQEAgLTEwNzUsNyArMTA3NSw3IEBACiAJCX0KIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJYXY3MTEwLT52aWRlb3N0YXRlLnZpZGVvX2Zvcm1hdCA9IGZvcm1hdDsKKwkJYXY3MTEwLT52aWRlb3N0YXRlLmRpc3BsYXlfZm9ybWF0ID0gZm9ybWF0OwogCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9FTkNPREVSLCBTZXRQYW5TY2FuVHlwZSwKIAkJCQkgICAgMSwgKHUxNikgdmFsKTsKIAkJYnJlYWs7CkBAIC0xMjMwLDE0ICsxMjMwLDIwIEBACiAJCXN3aXRjaChhdjcxMTAtPmF1ZGlvc3RhdGUuY2hhbm5lbF9zZWxlY3QpIHsKIAkJY2FzZSBBVURJT19TVEVSRU86CiAJCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfU1RFUkVPKTsKKwkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQorCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVURJT19NT05PX0xFRlQ6CiAJCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19MKTsKKwkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQorCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVURJT19NT05PX1JJR0hUOgogCQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fUik7CisJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQlpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAyLCAweDQ1KTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC0xNDA5LDEwICsxNDE1LDEwIEBACiAJYXY3MTEwLT52aWRlb19ldmVudHMub3ZlcmZsb3cgPSAwOwogCW1lbXNldCgmYXY3MTEwLT52aWRlb19zaXplLCAwLCBzaXplb2YgKHZpZGVvX3NpemVfdCkpOwogCi0JZHZiX3JlZ2lzdGVyX2RldmljZShhdjcxMTAtPmR2Yl9hZGFwdGVyLCAmYXY3MTEwLT52aWRlb19kZXYsCisJZHZiX3JlZ2lzdGVyX2RldmljZSgmYXY3MTEwLT5kdmJfYWRhcHRlciwgJmF2NzExMC0+dmlkZW9fZGV2LAogCQkJICAgICZkdmJkZXZfdmlkZW8sIGF2NzExMCwgRFZCX0RFVklDRV9WSURFTyk7CiAKLQlkdmJfcmVnaXN0ZXJfZGV2aWNlKGF2NzExMC0+ZHZiX2FkYXB0ZXIsICZhdjcxMTAtPmF1ZGlvX2RldiwKKwlkdmJfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPmR2Yl9hZGFwdGVyLCAmYXY3MTEwLT5hdWRpb19kZXYsCiAJCQkgICAgJmR2YmRldl9hdWRpbywgYXY3MTEwLCBEVkJfREVWSUNFX0FVRElPKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2NhLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfY2EuYwppbmRleCAyMWY3YWFjLi5jMzgwMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfY2EuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfY2EuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2lfbGxfcmVzZXQoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpjaWJ1Ziwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCWludCBzbG90cywgY2Ffc2xvdF9pbmZvX3QgKnNsb3QpCisJCSAgICAgICBpbnQgc2xvdHMsIGNhX3Nsb3RfaW5mb190ICpzbG90KQogewogCWludCBpOwogCWludCBsZW4gPSAwOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAKIGludCBhdjcxMTBfY2FfcmVnaXN0ZXIoc3RydWN0IGF2NzExMCAqYXY3MTEwKQogewotCXJldHVybiBkdmJfcmVnaXN0ZXJfZGV2aWNlKGF2NzExMC0+ZHZiX2FkYXB0ZXIsICZhdjcxMTAtPmNhX2RldiwKKwlyZXR1cm4gZHZiX3JlZ2lzdGVyX2RldmljZSgmYXY3MTEwLT5kdmJfYWRhcHRlciwgJmF2NzExMC0+Y2FfZGV2LAogCQkJCSAgICZkdmJkZXZfY2EsIGF2NzExMCwgRFZCX0RFVklDRV9DQSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKaW5kZXggYmQ2ZTVlYS4uN2ZhNGEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAKIC8qIGF2NzExMCBBUk0gY29yZSBib290IHN0dWZmICovCi0KKyNpZiAwCiB2b2lkIGF2NzExMF9yZXNldF9hcm0oc3RydWN0IGF2NzExMCAqYXY3MTEwKQogewogCXNhYTcxNDZfc2V0Z3BpbyhhdjcxMTAtPmRldiwgUkVTRVRfTElORSwgU0FBNzE0Nl9HUElPX09VVExPKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCWF2NzExMC0+YXJtX3JlYWR5ID0gMTsKIAlkcHJpbnRrKDEsICJyZXNldCBBUk1cbiIpOwogfQotCisjZW5kaWYgIC8qICAwICAqLwogCiBzdGF0aWMgaW50IHdhaXRkZWJpKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGFkciwgaW50IHN0YXRlKQogewpAQCAtMzM1LDcgKzMzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2F2NzExMF9zZW5kX2Z3X2NtZChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiogYnVmLCBpbnQgbGVuZ3RoKQorc3RhdGljIGludCBfX2F2NzExMF9zZW5kX2Z3X2NtZChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiogYnVmLCBpbnQgbGVuZ3RoKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CkBAIC00NTUsNyArNDU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF2NzExMF9zZW5kX2Z3X2NtZChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiogYnVmLCBpbnQgbGVuZ3RoKQorc3RhdGljIGludCBhdjcxMTBfc2VuZF9md19jbWQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYqIGJ1ZiwgaW50IGxlbmd0aCkKIHsKIAlpbnQgcmV0OwogCkBAIC01MDAsNiArNTAwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWYgMAogaW50IGF2NzExMF9zZW5kX2NpX2NtZChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IHN1YmNvbSwgdTggKmJ1ZiwgdTggbGVuKQogewogCWludCBpLCByZXQ7CkBAIC01MjEsNiArNTIyLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9zZW5kX2NpX2NtZCBlcnJvciAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogaW50IGF2NzExMF9md19yZXF1ZXN0KHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2ICpyZXF1ZXN0X2J1ZiwKIAkJICAgICAgaW50IHJlcXVlc3RfYnVmX2xlbiwgdTE2ICpyZXBseV9idWYsIGludCByZXBseV9idWZfbGVuKQpAQCAtNTkzLDcgKzU5NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdjcxMTBfZndfcXVlcnkoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdGFnLCB1MTYqIGJ1ZiwgczE2IGxlbmd0aCkKK3N0YXRpYyBpbnQgYXY3MTEwX2Z3X3F1ZXJ5KHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHRhZywgdTE2KiBidWYsIHMxNiBsZW5ndGgpCiB7CiAJaW50IHJldDsKIAlyZXQgPSBhdjcxMTBfZndfcmVxdWVzdChhdjcxMTAsICZ0YWcsIDAsIGJ1ZiwgbGVuZ3RoKTsKQEAgLTYxNyw3ICs2MTksNyBAQAogCiAJaWYgKGF2NzExMF9md19xdWVyeShhdjcxMTAsIHRhZywgYnVmLCAxNikpIHsKIAkJcHJpbnRrKCJkdmItdHRwY2k6IGZhaWxlZCB0byBib290IGZpcm13YXJlIEAgY2FyZCAlZFxuIiwKLQkJICAgICAgIGF2NzExMC0+ZHZiX2FkYXB0ZXItPm51bSk7CisJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjI4LDE2ICs2MzAsMTYgQEAKIAlhdjcxMTAtPmF2dHlwZSA9IChidWZbOF0gPDwgMTYpICsgYnVmWzldOwogCiAJcHJpbnRrKCJkdmItdHRwY2k6IGluZm8gQCBjYXJkICVkOiBmaXJtICUwOHgsIHJ0c2wgJTA4eCwgdmlkICUwOHgsIGFwcCAlMDh4XG4iLAotCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0sIGF2NzExMC0+YXJtX2Z3LAorCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSwgYXY3MTEwLT5hcm1fZncsCiAJICAgICAgIGF2NzExMC0+YXJtX3J0c2wsIGF2NzExMC0+YXJtX3ZpZCwgYXY3MTEwLT5hcm1fYXBwKTsKIAogCS8qIHByaW50IGZpcm13YXJlIGNhcGFiaWxpdGllcyAqLwogCWlmIChGV19DSV9MTF9TVVBQT1JUKGF2NzExMC0+YXJtX2FwcCkpCiAJCXByaW50aygiZHZiLXR0cGNpOiBmaXJtd2FyZSBAIGNhcmQgJWQgc3VwcG9ydHMgQ0kgbGluayBsYXllciBpbnRlcmZhY2VcbiIsCi0JCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0pOworCQkgICAgICAgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCWVsc2UKIAkJcHJpbnRrKCJkdmItdHRwY2k6IG5vIGZpcm13YXJlIHN1cHBvcnQgZm9yIENJIGxpbmsgbGF5ZXIgaW50ZXJmYWNlIEAgY2FyZCAlZFxuIiwKLQkJICAgICAgIGF2NzExMC0+ZHZiX2FkYXB0ZXItPm51bSk7CisJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKaW5kZXggYmY5MDFjNi4uNTIwNjFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKQEAgLTM2NCw3ICszNjQsNiBAQAogCiAKIAotZXh0ZXJuIHZvaWQgYXY3MTEwX3Jlc2V0X2FybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApOwogZXh0ZXJuIGludCBhdjcxMTBfYm9vdGFybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApOwogZXh0ZXJuIGludCBhdjcxMTBfZmlybXZlcnNpb24oc3RydWN0IGF2NzExMCAqYXY3MTEwKTsKICNkZWZpbmUgRldfQ0lfTExfU1VQUE9SVChhcm1fYXBwKSAoKGFybV9hcHApICYgMHg4MDAwMDAwMCkKQEAgLTM3MywxMiArMzcyLDggQEAKIAogZXh0ZXJuIGludCBhdjcxMTBfd2FpdF9tc2dzdGF0ZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiBmbGFncyk7CiBleHRlcm4gaW50IGF2NzExMF9md19jbWQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgdHlwZSwgaW50IGNvbSwgaW50IG51bSwgLi4uKTsKLWV4dGVybiBpbnQgX19hdjcxMTBfc2VuZF9md19jbWQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYqIGJ1ZiwgaW50IGxlbmd0aCk7Ci1leHRlcm4gaW50IGF2NzExMF9zZW5kX2Z3X2NtZChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiogYnVmLCBpbnQgbGVuZ3RoKTsKLWV4dGVybiBpbnQgYXY3MTEwX3NlbmRfY2lfY21kKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTggc3ViY29tLCB1OCAqYnVmLCB1OCBsZW4pOwogZXh0ZXJuIGludCBhdjcxMTBfZndfcmVxdWVzdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiAqcmVxdWVzdF9idWYsCiAJCQkgICAgIGludCByZXF1ZXN0X2J1Zl9sZW4sIHUxNiAqcmVwbHlfYnVmLCBpbnQgcmVwbHlfYnVmX2xlbik7Ci1leHRlcm4gaW50IGF2NzExMF9md19xdWVyeShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB0YWcsIHUxNiogQnVmZiwgczE2IGxlbmd0aCk7CiAKIAogLyogREVCSSAoc2FhNzE0NiBkYXRhIGV4dGVuc2lvbiBidXMgaW50ZXJmYWNlKSBhY2Nlc3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKaW5kZXggNmQyMjU2Zi4uNjY1Y2RiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKQEAgLTEwLDcgKzEwLDcgQEAKIAogI2RlZmluZSBVUF9USU1FT1VUIChIWi80KQogCi0vKiBlbmFibGUgaXIgZGVidWdnaW5nIGJ5IG9yJ2luZyBhdjcxMTBfZGVidWcgd2l0aCAxNiAqLworLyogZW5hYmxlIGlyIGRlYnVnZ2luZyBieSBvcidpbmcgZGVidWcgd2l0aCAxNiAqLwogCiBzdGF0aWMgaW50IGlyX2luaXRpYWxpemVkOwogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgaW5wdXRfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCmluZGV4IGViODRmYjAuLmU2NWZjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKQEAgLTQ2LDEzICs0NiwxMyBAQAogCiAJaWYgKGkyY190cmFuc2ZlcigmYXY3MTEwLT5pMmNfYWRhcCwgJm1zZ3MsIDEpICE9IDEpIHsKIAkJZHByaW50aygxLCAiZHZiLXR0cGNpOiBmYWlsZWQgQCBjYXJkICVkLCAldSA9ICV1XG4iLAotCQkgICAgICAgYXY3MTEwLT5kdmJfYWRhcHRlci0+bnVtLCByZWcsIHZhbCk7CisJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSwgcmVnLCB2YWwpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLWludCBtc3BfcmVhZHJlZyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGRldiwgdTE2IHJlZywgdTE2ICp2YWwpCitzdGF0aWMgaW50IG1zcF9yZWFkcmVnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTggZGV2LCB1MTYgcmVnLCB1MTYgKnZhbCkKIHsKIAl1OCBtc2cxWzNdID0geyBkZXYsIHJlZyA+PiA4LCByZWcgJiAweGZmIH07CiAJdTggbXNnMlsyXTsKQEAgLTYzLDcgKzYzLDcgQEAKIAogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2dzWzBdLCAyKSAhPSAyKSB7CiAJCWRwcmludGsoMSwgImR2Yi10dHBjaTogZmFpbGVkIEAgY2FyZCAlZCwgJXVcbiIsCi0JCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0sIHJlZyk7CisJCSAgICAgICBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSwgcmVnKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCSp2YWwgPSAobXNnMlswXSA8PCA4KSB8IG1zZzJbMV07CkBAIC01NTIsMTMgKzU1MiwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXByaW50aygiZHZiLXR0cGNpOiBEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCi0JCWF2NzExMC0+ZHZiX2FkYXB0ZXItPm51bSk7CisJCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKIAlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDsKIAltc2xlZXAoMTAwKTsgLy8gdGhlIHByb2JpbmcgYWJvdmUgcmVzZXRzIHRoZSBtc3AuLi4KIAltc3BfcmVhZHJlZyhhdjcxMTAsIE1TUF9SRF9EU1AsIDB4MDAxZSwgJnZlcnNpb24xKTsKIAltc3BfcmVhZHJlZyhhdjcxMTAsIE1TUF9SRF9EU1AsIDB4MDAxZiwgJnZlcnNpb24yKTsKIAlkcHJpbnRrKDEsICJkdmItdHRwY2k6IEAgY2FyZCAlZCBNU1AzNDAwIHZlcnNpb24gMHglMDR4IDB4JTA0eFxuIiwKLQkJYXY3MTEwLT5kdmJfYWRhcHRlci0+bnVtLCB2ZXJzaW9uMSwgdmVyc2lvbjIpOworCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSwgdmVyc2lvbjEsIHZlcnNpb24yKTsKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMTMsIDB4MGMwMCk7CiAJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDAwLCAweDdmMDApOyAvLyBsb3Vkc3BlYWtlciArIGhlYWRwaG9uZQogCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMjIwKTsgLy8gbG91ZHNwZWFrZXIgc291cmNlCkBAIC01OTYsNyArNTk2LDcgQEAKIAkJLyogaW5pdCB0aGUgc2FhNzExMyAqLwogCQl3aGlsZSAoKmkgIT0gMHhmZikgewogCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIGlbMF0sIGlbMV0pICE9IDEpIHsKLQkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIGluaXRpYWxpemF0aW9uIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLT5udW0pOworCQkJCWRwcmludGsoMSwgInNhYTcxMTMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIEAgY2FyZCAlZCIsIGF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWkgKz0gMjsKQEAgLTcyNiwxMSArNzI2LDExIEBACiB7CiAJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBkZXYtPmV4dF9wcml2OwogCi0JaWYgKHN0ZC0+aWQgPT0gVjRMMl9TVERfUEFMKSB7CisJaWYgKHN0ZC0+aWQgJiBWNEwyX1NURF9QQUwpIHsKIAkJYXY3MTEwLT52aWRtb2RlID0gVklERU9fTU9ERV9QQUw7CiAJCWF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIGF2NzExMC0+dmlkbW9kZSk7CiAJfQotCWVsc2UgaWYgKHN0ZC0+aWQgPT0gVjRMMl9TVERfTlRTQykgeworCWVsc2UgaWYgKHN0ZC0+aWQgJiBWNEwyX1NURF9OVFNDKSB7CiAJCWF2NzExMC0+dmlkbW9kZSA9IFZJREVPX01PREVfTlRTQzsKIAkJYXY3MTEwX3NldF92aWRtb2RlKGF2NzExMCwgYXY3MTEwLT52aWRtb2RlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCmluZGV4IDE0ZTk2MzIuLjZlMGY1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCkBAIC01OSw4ICs1OSwxMiBAQAogCXN0cnVjdCBkdmJfY2FfZW41MDIyMSBjYTsKIH07CiAKLXN0YXRpYyBpbnQgZW5hYmxlX2NpID0gMDsKLQorLyogR1BJTyBDSSBDb25uZWN0aW9uczoKKyAqIDAgLSBWY2MvUmVzZXQgKFJlc2V0IGlzIGNvbnRyb2xsZWQgYnkgY2FwYWNpdG9yKQorICogMSAtIEF0dHJpYnV0ZSBNZW1vcnkKKyAqIDIgLSBDYXJkIEVuYWJsZSAoQWN0aXZlIExvdykKKyAqIDMgLSBDYXJkIERldGVjdAorICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJTklUSUFMSVpBVElPTgpAQCAtMTg4LDIyICsxOTIsMzUgQEAKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYgPSAoc3RydWN0IGJ1ZGdldF9hdiAqKSBjYS0+ZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKnNhYSA9IGJ1ZGdldF9hdi0+YnVkZ2V0LmRldjsKLQlpbnQgbWF4ID0gMjA7CisJaW50IHRpbWVvdXQgPSA1MDsgLy8gNSBzZWNvbmRzICg0LjQuNiBSZWFkeSkKIAogCWlmIChzbG90ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZHByaW50aygxLCAiY2lpbnRmX3Nsb3RfcmVzZXRcbiIpOwogCi0JLyogcmVzZXQgdGhlIGNhcmQgKi8KLQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwotCW1zbGVlcCgxMDApOwotCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRMTyk7CisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMiwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogZGlzYWJsZSBjYXJkICovCiAKLQl3aGlsZSAoLS1tYXggPiAwICYmIGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApICE9IDB4MWQpCisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogVmNjIG9mZiAqLworCW1zbGVlcCgyKTsKKwlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvKiBWY2Mgb24gKi8KKwltc2xlZXAoMjApOyAvKiAyMCBtcyBWY2Mgc2V0dGxpbmcgdGltZSAqLworCisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMiwgU0FBNzE0Nl9HUElPX09VVExPKTsgLyogZW5hYmxlIGNhcmQgKi8KKworCS8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBiYXNlZCBvbiBwaW4gMTYgUkVBRFkgb2YgdGhlIHBjbWNpYSBwb3J0LAorCSAqIGJ1dCBBRkFJQ1MgaXQgaXMgbm90IHJvdXRlZCB0byB0aGUgc2FhNzE0NiAqLworCXdoaWxlICgtLXRpbWVvdXQgPiAwICYmIGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApICE9IDB4MWQpCiAJCW1zbGVlcCgxMDApOwogCi0JdHRwY2lfYnVkZ2V0X3NldF92aWRlb19wb3J0KHNhYSwgQlVER0VUX1ZJREVPX1BPUlRCKTsKKwlpZiAodGltZW91dCA8PSAwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IGNhbSByZXNldCBmYWlsZWQgKHRpbWVvdXQpLlxuIik7CisJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLworCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBWY2Mgb2ZmICovCisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yNDAsNyArMjU3LDYgQEAKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYgPSAoc3RydWN0IGJ1ZGdldF9hdiAqKSBjYS0+ZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKnNhYSA9IGJ1ZGdldF9hdi0+YnVkZ2V0LmRldjsKLQlpbnQgY2FtID0gMDsKIAogCWlmIChzbG90ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ4LDE1ICsyNjQsMjEgQEAKIAlpZiAoIWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMpIHsKIAkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX0lOUFVUKTsKIAkJdWRlbGF5KDEpOwotCQljYW0gPSBzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNjsKLQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsKLQotCQlpZiAoY2FtKQorCQlpZiAoc2FhNzE0Nl9yZWFkKHNhYSwgUFNSKSAmIE1BU0tfMDYpCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGluc2VydGVkXG4iKTsKIAkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSAxOworCQl9CisJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAJfSBlbHNlIGlmICghb3BlbikgewogCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwogCQlpZiAodHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCAwLCAxLCAwLCAxKSA9PSAtRVRJTUVET1VUKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkXG4iKTsKKwkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLworCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogVmNjIG9mZiAqLwogCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CisJCX0KIAl9CiAKIAlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9PSAxKQpAQCAtMjcyLDE3ICsyOTQsMTEgQEAKIAogCW1lbXNldCgmYnVkZ2V0X2F2LT5jYSwgMCwgc2l6ZW9mKHN0cnVjdCBkdmJfY2FfZW41MDIyMSkpOwogCi0JLyogc2V0dXAgR1BJT3MgKi8KLQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOworCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRMTyk7CisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMSwgU0FBNzE0Nl9HUElPX09VVExPKTsKIAlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwogCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAKLQkvKiBSZXNldCB0aGUgY2FyZCAqLwotCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRISSk7Ci0JbXNsZWVwKDUwKTsKLQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwotCW1zbGVlcCgxMDApOwotCiAJLyogRW5hYmxlIERFQkkgcGlucyAqLwogCXNhYTcxNDZfd3JpdGUoc2FhLCBNQzEsIHNhYTcxNDZfcmVhZChzYWEsIE1DMSkgfCAoMHg4MDAgPDwgMTYpIHwgMHg4MDApOwogCkBAIC0yOTcsMTMgKzMxMywxNCBAQAogCWJ1ZGdldF9hdi0+Y2Euc2xvdF90c19lbmFibGUgPSBjaWludGZfc2xvdF90c19lbmFibGU7CiAJYnVkZ2V0X2F2LT5jYS5wb2xsX3Nsb3Rfc3RhdHVzID0gY2lpbnRmX3BvbGxfc2xvdF9zdGF0dXM7CiAJYnVkZ2V0X2F2LT5jYS5kYXRhID0gYnVkZ2V0X2F2OwotCWlmICgocmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfaW5pdChidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKKworCWlmICgocmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfaW5pdCgmYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIsCiAJCQkJCSAgJmJ1ZGdldF9hdi0+Y2EsIDAsIDEpKSAhPSAwKSB7Ci0JCXByaW50aygiYnVkZ2V0X2F2OiBDSSBpbnRlcmZhY2UgZGV0ZWN0ZWQsIGJ1dCBpbml0aWFsaXNhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IGNpIGluaXRpYWxpc2F0aW9uIGZhaWxlZC5cbiIpOwogCQlnb3RvIGVycm9yOwogCX0KLQkvLyBzdWNjZXNzIQotCXByaW50aygiY2lpbnRmX2luaXQ6IENJIGludGVyZmFjZSBpbml0aWFsaXNlZFxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNpIGludGVyZmFjZSBpbml0aWFsaXNlZC5cbiIpOwogCWJ1ZGdldF9hdi0+YnVkZ2V0LmNpX3ByZXNlbnQgPSAxOwogCXJldHVybiAwOwogCkBAIC0zNjEsOCArMzc4LDEyIEBACiBzdGF0aWMgaW50IHNhYTcxMTNfaW5pdChzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7CiAJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gJmJ1ZGdldF9hdi0+YnVkZ2V0OworCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0LT5kZXY7CiAJY29uc3QgdTggKmRhdGEgPSBzYWE3MTEzX3RhYjsKIAorCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRISSk7CisJbXNsZWVwKDIwMCk7CisKIAlpZiAoaTJjX3dyaXRlcmVnKCZidWRnZXQtPmkyY19hZGFwLCAweDRhLCAweDAxLCAweDA4KSAhPSAxKSB7CiAJCWRwcmludGsoMSwgInNhYTcxMTMgbm90IGZvdW5kIG9uIEtOQyBjYXJkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02OTcsNzUgKzcxOCw5MCBAQAogCXJldHVybiBwd207CiB9CiAKKyNkZWZpbmUgU1VCSURfRFZCU19LTkMxCQkweDAwMTAKKyNkZWZpbmUgU1VCSURfRFZCU19LTkMxX1BMVVMJMHgwMDExCisjZGVmaW5lIFNVQklEX0RWQlNfVFlQSE9PTgkweDRmNTYKKyNkZWZpbmUgU1VCSURfRFZCU19DSU5FUkdZMTIwMAkweDExNTQKKworI2RlZmluZSBTVUJJRF9EVkJDX0tOQzEJCTB4MDAyMAorI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkweDAwMjEKKyNkZWZpbmUgU1VCSURfRFZCQ19DSU5FUkdZMTIwMAkweDExNTYKKworI2RlZmluZSBTVUJJRF9EVkJUX0tOQzFfUExVUwkweDAwMzEKKyNkZWZpbmUgU1VCSURfRFZCVF9LTkMxCQkweDAwMzAKKyNkZWZpbmUgU1VCSURfRFZCVF9DSU5FUkdZMTIwMAkweDExNTcKIAogc3RhdGljIHZvaWQgZnJvbnRlbmRfaW5pdChzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7Ci0Jc3dpdGNoIChidWRnZXRfYXYtPmJ1ZGdldC5kZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgewotCWNhc2UgMHg0ZjU2OgkJLy8gVHlwaG9vbi9LTkMxIERWQi1TIGJ1ZGdldCAoc3R2MDI5OS9QaGlsaXBzIFNVMTI3OCh0c2E1MDU5KSkKLQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0KLQkJCXN0djAyOTlfYXR0YWNoKCZ0eXBob29uX2NvbmZpZywgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKLQkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCAhPSBOVUxMKSB7CisJc3RydWN0IHNhYTcxNDZfZGV2ICogc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKiBmZSA9IE5VTEw7CisKKwlzd2l0Y2ggKHNhYS0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCWNhc2UgU1VCSURfRFZCU19LTkMxX1BMVVM6CisJCWNhc2UgU1VCSURfRFZCQ19LTkMxX1BMVVM6CisJCWNhc2UgU1VCSURfRFZCVF9LTkMxX1BMVVM6CisJCQkvLyBFbmFibGUgLyBQb3dlck9OIEZyb250ZW5kCisJCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCQkJYnJlYWs7Ci0JCX0KKwl9CisKKwlzd2l0Y2ggKHNhYS0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisKKwljYXNlIFNVQklEX0RWQlNfS05DMToKKwljYXNlIFNVQklEX0RWQlNfS05DMV9QTFVTOgorCWNhc2UgU1VCSURfRFZCU19UWVBIT09OOgorCQlmZSA9IHN0djAyOTlfYXR0YWNoKCZ0eXBob29uX2NvbmZpZywKKwkJCQkgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJYnJlYWs7CiAKLQljYXNlIDB4MDAyMDoJCS8vIEtOQzEgRFZCLUMgYnVkZ2V0ICh0ZGExMDAyMS9QaGlsaXBzIENVMTIxNih0dWE2MDM0KSkKLQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0KLQkJCXRkYTEwMDIxX2F0dGFjaCgmcGhpbGlwc19jdTEyMTZfY29uZmlnLAotCQkJCQkmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsIHJlYWRfcHdtKGJ1ZGdldF9hdikpOwotCQlpZiAoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kICE9IE5VTEwpIHsKLQkJCWJyZWFrOwotCQl9CisJY2FzZSBTVUJJRF9EVkJTX0NJTkVSR1kxMjAwOgorCQlmZSA9IHN0djAyOTlfYXR0YWNoKCZjaW5lcmd5XzEyMDBzX2NvbmZpZywKKwkJCQkgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJYnJlYWs7CiAKLQljYXNlIDB4MDAzMDoJCS8vIEtOQzEgRFZCLVQgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIFRVMTIxNih0ZGE2NjUxdHQpKQotCQlidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQotCQkJdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3R1MTIxNl9jb25maWcsICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7Ci0JCWlmIChidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCX0KKwljYXNlIFNVQklEX0RWQkNfS05DMToKKwljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTOgorCQlmZSA9IHRkYTEwMDIxX2F0dGFjaCgmcGhpbGlwc19jdTEyMTZfY29uZmlnLAorCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwLAorCQkJCSAgICAgcmVhZF9wd20oYnVkZ2V0X2F2KSk7CiAJCWJyZWFrOwogCi0JY2FzZSAweDExNTQ6CQkvLyBUZXJyYVRlYyBDaW5lcmd5IDEyMDAgRFZCLVMgKHN0djAyOTkvUGhpbGlwcyBTVTEyNzgodHNhNTA1OSkpCi0JCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9Ci0JCQlzdHYwMjk5X2F0dGFjaCgmY2luZXJneV8xMjAwc19jb25maWcsICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7Ci0JCWlmIChidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCX0KKwljYXNlIFNVQklEX0RWQlRfS05DMToKKwljYXNlIFNVQklEX0RWQlRfS05DMV9QTFVTOgorCQlmZSA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190dTEyMTZfY29uZmlnLAorCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJYnJlYWs7CiAKLQljYXNlIDB4MTE1NjoJCS8vIFRlcnJhdGVjIENpbmVyZ3kgMTIwMCBEVkItQyAodGRhMTAwMjEvUGhpbGlwcyBDVTEyMTYodHVhNjAzNCkpCi0JCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9Ci0JCQl0ZGExMDAyMV9hdHRhY2goJnBoaWxpcHNfY3UxMjE2X2NvbmZpZywKLQkJCQkJJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwLCByZWFkX3B3bShidWRnZXRfYXYpKTsKLQkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewotCQkJYnJlYWs7Ci0JCX0KKwljYXNlIFNVQklEX0RWQkNfQ0lORVJHWTEyMDA6CisJCWZlID0gdGRhMTAwMjFfYXR0YWNoKCZwaGlsaXBzX2N1MTIxNl9jb25maWcsCisJCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsCisJCQkJICAgICByZWFkX3B3bShidWRnZXRfYXYpKTsKIAkJYnJlYWs7CiAKLQljYXNlIDB4MTE1NzoJCS8vIFRlcnJhdGVjIENpbmVyZ3kgMTIwMCBEVkItVCAodGRhMTAwNDYvUGhpbGlwcyBUVTEyMTYodGRhNjY1MXR0KSkKLQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0KLQkJCXRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190dTEyMTZfY29uZmlnLCAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOwotCQlpZiAoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7Ci0JCQlicmVhazsKLQkJfQorCWNhc2UgU1VCSURfRFZCVF9DSU5FUkdZMTIwMDoKKwkJZmUgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2X2NvbmZpZywKKwkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPT0gTlVMTCkgewotCQlwcmludGsoImJ1ZGdldF9hdjogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlICUwNHgvJTA0eCBzdWJzeXN0ZW0gJTA0eC8lMDR4XG4iLAotCQkgICAgICAgYnVkZ2V0X2F2LT5idWRnZXQuZGV2LT5wY2ktPnZlbmRvciwKLQkJICAgICAgIGJ1ZGdldF9hdi0+YnVkZ2V0LmRldi0+cGNpLT5kZXZpY2UsCi0JCSAgICAgICBidWRnZXRfYXYtPmJ1ZGdldC5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKLQkJICAgICAgIGJ1ZGdldF9hdi0+YnVkZ2V0LmRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKLQl9IGVsc2UgewotCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kCi0JCSAgICAoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIsIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKLQkJCXByaW50aygiYnVkZ2V0LWF2OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCi0JCQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKLQkJCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9IE5VTEw7Ci0JCX0KKwlpZiAoZmUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJ1ZGdldC1hdjogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCAiCisJCQkJImZvciBkZXZpY2UgJTA0eC8lMDR4IHN1YnN5c3RlbSAlMDR4LyUwNHhcbiIsCisJCSAgICAgICBzYWEtPnBjaS0+dmVuZG9yLAorCQkgICAgICAgc2FhLT5wY2ktPmRldmljZSwKKwkJICAgICAgIHNhYS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkgICAgICAgc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0gZmU7CisKKwlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKKwkJCQkgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKKwkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQorCQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKKwkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKIAl9CiB9CiAKQEAgLTgyMiw2ICs4NTgsNyBAQAogCiAJbWVtc2V0KGJ1ZGdldF9hdiwgMCwgc2l6ZW9mKHN0cnVjdCBidWRnZXRfYXYpKTsKIAorCWJ1ZGdldF9hdi0+aGFzX3NhYTcxMTMgPSAwOwogCWJ1ZGdldF9hdi0+YnVkZ2V0LmNpX3ByZXNlbnQgPSAwOwogCiAJZGV2LT5leHRfcHJpdiA9IGJ1ZGdldF9hdjsKQEAgLTgzNiwxMCArODczLDcgQEAKIAlzYWE3MTQ2X3dyaXRlKGRldiwgREQxX0lOSVQsIDB4MDcwMDA2MDApOwogCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIE1BU0tfMDkgfCBNQVNLXzI1IHwgTUFTS18xMCB8IE1BU0tfMjYpOwogCi0Jc2FhNzE0Nl9zZXRncGlvKGRldiwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsKLQltc2xlZXAoNTAwKTsKLQotCWlmICgwID09IHNhYTcxMTNfaW5pdChidWRnZXRfYXYpKSB7CisJaWYgKHNhYTcxMTNfaW5pdChidWRnZXRfYXYpID09IDApIHsKIAkJYnVkZ2V0X2F2LT5oYXNfc2FhNzExMyA9IDE7CiAKIAkJaWYgKDAgIT0gc2FhNzE0Nl92dl9pbml0KGRldiwgJnZ2X2RhdGEpKSB7CkBAIC04NjAsMzEgKzg5NCwyNiBAQAogCiAJCXNhYTcxMTNfc2V0aW5wdXQoYnVkZ2V0X2F2LCAwKTsKIAl9IGVsc2UgewotCQlidWRnZXRfYXYtPmhhc19zYWE3MTEzID0gMDsKLQotCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAwLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOworCQljaWludGZfaW5pdChidWRnZXRfYXYpOwogCX0KIAogCS8qIGZpeG1lOiBmaW5kIHNvbWUgc2FuZSB2YWx1ZXMgaGVyZS4uLiAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBQQ0lfQlRfVjEsIDB4MWMwMDEwMWYpOwogCi0JbWFjID0gYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXItPnByb3Bvc2VkX21hYzsKKwltYWMgPSBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5wcm9wb3NlZF9tYWM7CiAJaWYgKGkyY19yZWFkcmVncygmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsIDB4YTAsIDB4MzAsIG1hYywgNikpIHsKLQkJcHJpbnRrKCJLTkMxLSVkOiBDb3VsZCBub3QgcmVhZCBNQUMgZnJvbSBLTkMxIGNhcmRcbiIsCi0JCSAgICAgICBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci0+bnVtKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJLTkMxLSVkOiBDb3VsZCBub3QgcmVhZCBNQUMgZnJvbSBLTkMxIGNhcmRcbiIsCisJCSAgICAgICBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5udW0pOwogCQltZW1zZXQobWFjLCAwLCA2KTsKIAl9IGVsc2UgewotCQlwcmludGsoIktOQzEtJWQ6IE1BQyBhZGRyID0gJS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4OiUuMnhcbiIsCi0JCSAgICAgICBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci0+bnVtLAorCQlwcmludGsoS0VSTl9JTkZPICJLTkMxLSVkOiBNQUMgYWRkciA9ICUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAorCQkgICAgICAgYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIubnVtLAogCQkgICAgICAgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CiAJfQogCi0JYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXItPnByaXYgPSBidWRnZXRfYXY7CisJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIucHJpdiA9IGJ1ZGdldF9hdjsKIAlmcm9udGVuZF9pbml0KGJ1ZGdldF9hdik7CiAKLQlpZiAoZW5hYmxlX2NpKQotCQljaWludGZfaW5pdChidWRnZXRfYXYpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MywxNCArOTkyLDIxIEBACiBNQUtFX0JVREdFVF9JTkZPKGtuYzFzLCAiS05DMSBEVkItUyIsIEJVREdFVF9LTkMxUyk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjLCAiS05DMSBEVkItQyIsIEJVREdFVF9LTkMxQyk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzF0LCAiS05DMSBEVkItVCIsIEJVREdFVF9LTkMxVCk7CitNQUtFX0JVREdFVF9JTkZPKGtuYzFzcCwgIktOQzEgRFZCLVMgUGx1cyIsIEJVREdFVF9LTkMxU1ApOworTUFLRV9CVURHRVRfSU5GTyhrbmMxY3AsICJLTkMxIERWQi1DIFBsdXMiLCBCVURHRVRfS05DMUNQKTsKK01BS0VfQlVER0VUX0lORk8oa25jMXRwLCAiS05DMSBEVkItVCBQbHVzIiwgQlVER0VUX0tOQzFUUCk7CiBNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDBzLCAiVGVycmFUZWMgQ2luZXJneSAxMjAwIERWQi1TIiwgQlVER0VUX0NJTjEyMDBTKTsKIE1BS0VfQlVER0VUX0lORk8oY2luMTIwMGMsICJUZXJyYXRlYyBDaW5lcmd5IDEyMDAgRFZCLUMiLCBCVURHRVRfQ0lOMTIwMEMpOwogTUFLRV9CVURHRVRfSU5GTyhjaW4xMjAwdCwgIlRlcnJhdGVjIENpbmVyZ3kgMTIwMCBEVkItVCIsIEJVREdFVF9DSU4xMjAwVCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7CiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFzLCAweDExMzEsIDB4NGY1NiksCisJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFzLCAweDExMzEsIDB4MDAxMCksCisJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFzcCwgMHgxMTMxLCAweDAwMTEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxYywgMHgxODk0LCAweDAwMjApLAorCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxY3AsIDB4MTg5NCwgMHgwMDIxKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMXQsIDB4MTg5NCwgMHgwMDMwKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMXRwLCAweDE4OTQsIDB4MDAzMSksCiAJTUFLRV9FWFRFTlNJT05fUENJKGNpbjEyMDBzLCAweDE1M2IsIDB4MTE1NCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGNpbjEyMDBjLCAweDE1M2IsIDB4MTE1NiksCiAJTUFLRV9FWFRFTlNJT05fUENJKGNpbjEyMDB0LCAweDE1M2IsIDB4MTE1NyksCkBAIC0xMDEwLDUgKzEwNDYsMyBAQAogTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciwgTWFyY3VzIE1ldHpsZXIsIE1pY2hhZWwgSHVub2xkLCBvdGhlcnMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciB0aGUgU0FBNzE0NiBiYXNlZCBzby1jYWxsZWQgIgogCQkgICAiYnVkZ2V0IFBDSSBEVkIgdy8gYW5hbG9nIGlucHV0IGFuZCBDSS1tb2R1bGUgKGUuZy4gdGhlIEtOQyBjYXJkcykiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChlbmFibGVfY2ksIGVuYWJsZV9jaSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2NpLCAiVHVybiBvbi9vZmYgQ0kgbW9kdWxlIChkZWZhdWx0Om9mZikuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCmluZGV4IDUyMTExMWJlLi5kY2UxMTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJYnVkZ2V0X2NpLT5jYS5zbG90X3NodXRkb3duID0gY2lpbnRmX3Nsb3Rfc2h1dGRvd247CiAJYnVkZ2V0X2NpLT5jYS5zbG90X3RzX2VuYWJsZSA9IGNpaW50Zl9zbG90X3RzX2VuYWJsZTsKIAlidWRnZXRfY2ktPmNhLmRhdGEgPSBidWRnZXRfY2k7Ci0JaWYgKChyZXN1bHQgPSBkdmJfY2FfZW41MDIyMV9pbml0KGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9hZGFwdGVyLAorCWlmICgocmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfaW5pdCgmYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2FkYXB0ZXIsCiAJCQkJCSAgJmJ1ZGdldF9jaS0+Y2EsCiAJCQkJCSAgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFIHwKIAkJCQkJICBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9GUiB8CkBAIC04ODEsNyArODgxLDcgQEAKIAkJICAgICAgIGJ1ZGdldF9jaS0+YnVkZ2V0LmRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAl9IGVsc2UgewogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kCi0JCSAgICAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2FkYXB0ZXIsIGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKKwkJICAgICgmYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2FkYXB0ZXIsIGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWNpOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7CiAJCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCiAJCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKQEAgLTkxNiw3ICs5MTYsNyBAQAogCiAJY2lpbnRmX2luaXQoYnVkZ2V0X2NpKTsKIAotCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9hZGFwdGVyLT5wcml2ID0gYnVkZ2V0X2NpOworCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9hZGFwdGVyLnByaXYgPSBidWRnZXRfY2k7CiAJZnJvbnRlbmRfaW5pdChidWRnZXRfY2kpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwppbmRleCA5M2E5YjQwLi4wNDk4YTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCWJ1ZGdldC0+ZG14ZGV2LmRlbXV4ID0gJmR2YmRlbXV4LT5kbXg7CiAJYnVkZ2V0LT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKIAotCWR2Yl9kbXhkZXZfaW5pdCgmYnVkZ2V0LT5kbXhkZXYsIGJ1ZGdldC0+ZHZiX2FkYXB0ZXIpOworCWR2Yl9kbXhkZXZfaW5pdCgmYnVkZ2V0LT5kbXhkZXYsICZidWRnZXQtPmR2Yl9hZGFwdGVyKTsKIAogCWJ1ZGdldC0+aHdfZnJvbnRlbmQuc291cmNlID0gRE1YX0ZST05URU5EXzA7CiAKQEAgLTMxNiw3ICszMTYsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZHZiX25ldF9pbml0KGJ1ZGdldC0+ZHZiX2FkYXB0ZXIsICZidWRnZXQtPmR2Yl9uZXQsICZkdmJkZW11eC0+ZG14KTsKKwlkdmJfbmV0X2luaXQoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsICZidWRnZXQtPmR2Yl9uZXQsICZkdmJkZW11eC0+ZG14KTsKIAogCXJldHVybiAwOwogfQpAQCAtMzg1LDExICszODUsMTEgQEAKIAlzdHJjcHkoYnVkZ2V0LT5pMmNfYWRhcC5uYW1lLCBidWRnZXQtPmNhcmQtPm5hbWUpOwogCiAJaWYgKGkyY19hZGRfYWRhcHRlcigmYnVkZ2V0LT5pMmNfYWRhcCkgPCAwKSB7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoYnVkZ2V0LT5kdmJfYWRhcHRlcik7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQl0dHBjaV9lZXByb21fcGFyc2VfbWFjKCZidWRnZXQtPmkyY19hZGFwLCBidWRnZXQtPmR2Yl9hZGFwdGVyLT5wcm9wb3NlZF9tYWMpOworCXR0cGNpX2VlcHJvbV9wYXJzZV9tYWMoJmJ1ZGdldC0+aTJjX2FkYXAsIGJ1ZGdldC0+ZHZiX2FkYXB0ZXIucHJvcG9zZWRfbWFjKTsKIAogCWlmIChOVUxMID09CiAJICAgIChidWRnZXQtPmdyYWJiaW5nID0gc2FhNzE0Nl92bWFsbG9jX2J1aWxkX3BndGFibGUoZGV2LT5wY2ksIGxlbmd0aCwgJmJ1ZGdldC0+cHQpKSkgewpAQCAtNDE3LDcgKzQxNyw3IEBACiAKIAl2ZnJlZShidWRnZXQtPmdyYWJiaW5nKTsKIAotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoYnVkZ2V0LT5kdmJfYWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmYnVkZ2V0LT5kdmJfYWRhcHRlcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDMyLDcgKzQzMiw3IEBACiAKIAlpMmNfZGVsX2FkYXB0ZXIoJmJ1ZGdldC0+aTJjX2FkYXApOwogCi0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihidWRnZXQtPmR2Yl9hZGFwdGVyKTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZidWRnZXQtPmR2Yl9hZGFwdGVyKTsKIAogCXRhc2tsZXRfa2lsbCgmYnVkZ2V0LT52cGVfdGFza2xldCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKaW5kZXggNWQ1MjRhNC4uODE0MmUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCQkgICAgICAgYnVkZ2V0LT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKIAkJICAgICAgIGJ1ZGdldC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCX0gZWxzZSB7Ci0JCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYnVkZ2V0LT5kdmJfYWRhcHRlciwgYnVkZ2V0LT5kdmJfZnJvbnRlbmQpKSB7CisJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSkgewogCQkJcHJpbnRrKCJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAkJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQogCQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpOwpAQCAtNzAyLDcgKzcwMiw3IEBACiAKICAgICAgICAgZGV2LT5leHRfcHJpdiA9IGJ1ZGdldDsKIAotCWJ1ZGdldC0+ZHZiX2FkYXB0ZXItPnByaXYgPSBidWRnZXQ7CisJYnVkZ2V0LT5kdmJfYWRhcHRlci5wcml2ID0gYnVkZ2V0OwogCWZyb250ZW5kX2luaXQoYnVkZ2V0KTsKIAogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggNWU2YTEwZi4uMDgzZmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTQ2OCw3ICs0NjgsNyBAQAogCQkgICAgICAgYnVkZ2V0LT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKIAkJICAgICAgIGJ1ZGdldC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCX0gZWxzZSB7Ci0JCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYnVkZ2V0LT5kdmJfYWRhcHRlciwgYnVkZ2V0LT5kdmJfZnJvbnRlbmQpKSB7CisJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSkgewogCQkJcHJpbnRrKCJidWRnZXQ6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAkJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQogCQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpOwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JYnVkZ2V0LT5kdmJfYWRhcHRlci0+cHJpdiA9IGJ1ZGdldDsKKwlidWRnZXQtPmR2Yl9hZGFwdGVyLnByaXYgPSBidWRnZXQ7CiAJZnJvbnRlbmRfaW5pdChidWRnZXQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCmluZGV4IDEwYmQ0MWYuLmM2ZWY0OTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaApAQCAtNjQsNyArNjQsNyBAQAogCiAJc3BpbmxvY2tfdCBkZWJpbG9jazsKIAotCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXI7CisJc3RydWN0IGR2Yl9hZGFwdGVyIGR2Yl9hZGFwdGVyOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmR2Yl9mcm9udGVuZDsKIAl2b2lkICpwcml2OwogfTsKQEAgLTkyLDYgKzkyLDkgQEAKICNkZWZpbmUgQlVER0VUX0tOQzFTCQkgICA4CiAjZGVmaW5lIEJVREdFVF9LTkMxQwkJICAgOQogI2RlZmluZSBCVURHRVRfS05DMVQJCSAgIDEwCisjZGVmaW5lIEJVREdFVF9LTkMxU1AJCSAgIDExCisjZGVmaW5lIEJVREdFVF9LTkMxQ1AJCSAgIDEyCisjZGVmaW5lIEJVREdFVF9LTkMxVFAJCSAgIDEzCiAKICNkZWZpbmUgQlVER0VUX1ZJREVPX1BPUlRBICAgICAgICAgMAogI2RlZmluZSBCVURHRVRfVklERU9fUE9SVEIgICAgICAgICAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYwppbmRleCA0YzA0NmVjLi5hZmEwZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKQEAgLTg0LDcgKzg0LDcgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbWkyYzsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbXVzYjsKIAotCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgYWRhcHRlcjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCiAJc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGN4MjI3MDBfY29uZmlnIGFscHNfdGRtYjdfY29uZmlnID0geworc3RhdGljIHN0cnVjdCBjeDIyNzAwX2NvbmZpZyBhbHBzX3RkbWI3X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCiAJLnBsbF9zZXQgPSBhbHBzX3RkbWI3X3BsbF9zZXQsCiB9OwpAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAkJICAgICAgIGxlMTZfdG9fY3B1KHR0dXNiLT5kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkgICAgICAgbGUxNl90b19jcHUodHR1c2ItPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKIAl9IGVsc2UgewotCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKHR0dXNiLT5hZGFwdGVyLCB0dHVzYi0+ZmUpKSB7CisJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnR0dXNiLT5hZGFwdGVyLCB0dHVzYi0+ZmUpKSB7CiAJCQlwcmludGsoImR2Yi10dHVzYi1idWRnZXQ6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAkJCWlmICh0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSkKIAkJCQl0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSh0dHVzYi0+ZmUpOwpAQCAtMTQ2Miw3ICsxNDYyLDcgQEAKIAl1cCgmdHR1c2ItPnNlbWkyYyk7CiAKIAlkdmJfcmVnaXN0ZXJfYWRhcHRlcigmdHR1c2ItPmFkYXB0ZXIsICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgTm92YS1VU0IiLCBUSElTX01PRFVMRSk7Ci0JdHR1c2ItPmFkYXB0ZXItPnByaXYgPSB0dHVzYjsKKwl0dHVzYi0+YWRhcHRlci5wcml2ID0gdHR1c2I7CiAKIAkvKiBpMmMgKi8KIAltZW1zZXQoJnR0dXNiLT5pMmNfYWRhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOwpAQCAtMTQ4MSw3ICsxNDgxLDcgQEAKIAogCXJlc3VsdCA9IGkyY19hZGRfYWRhcHRlcigmdHR1c2ItPmkyY19hZGFwKTsKIAlpZiAocmVzdWx0KSB7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKHR0dXNiLT5hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlciAoJnR0dXNiLT5hZGFwdGVyKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTE1MDMsNyArMTUwMyw3IEBACiAJaWYgKChyZXN1bHQgPSBkdmJfZG14X2luaXQoJnR0dXNiLT5kdmJfZGVtdXgpKSA8IDApIHsKIAkJcHJpbnRrKCJ0dHVzYl9kdmI6IGR2Yl9kbXhfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLCByZXN1bHQpOwogCQlpMmNfZGVsX2FkYXB0ZXIoJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKHR0dXNiLT5hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlciAoJnR0dXNiLT5hZGFwdGVyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogLy9GSVhNRSBkbXhkZXYgKG51ciBXQVM/KQpAQCAtMTUxMSwyMSArMTUxMSwyMSBAQAogCXR0dXNiLT5kbXhkZXYuZGVtdXggPSAmdHR1c2ItPmR2Yl9kZW11eC5kbXg7CiAJdHR1c2ItPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwogCi0JaWYgKChyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJnR0dXNiLT5kbXhkZXYsIHR0dXNiLT5hZGFwdGVyKSkgPCAwKSB7CisJaWYgKChyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJnR0dXNiLT5kbXhkZXYsICZ0dHVzYi0+YWRhcHRlcikpIDwgMCkgewogCQlwcmludGsoInR0dXNiX2R2YjogZHZiX2RteGRldl9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsCiAJCSAgICAgICByZXN1bHQpOwogCQlkdmJfZG14X3JlbGVhc2UoJnR0dXNiLT5kdmJfZGVtdXgpOwogCQlpMmNfZGVsX2FkYXB0ZXIoJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKHR0dXNiLT5hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlciAoJnR0dXNiLT5hZGFwdGVyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGR2Yl9uZXRfaW5pdCh0dHVzYi0+YWRhcHRlciwgJnR0dXNiLT5kdmJuZXQsICZ0dHVzYi0+ZHZiX2RlbXV4LmRteCkpIHsKKwlpZiAoZHZiX25ldF9pbml0KCZ0dHVzYi0+YWRhcHRlciwgJnR0dXNiLT5kdmJuZXQsICZ0dHVzYi0+ZHZiX2RlbXV4LmRteCkpIHsKIAkJcHJpbnRrKCJ0dHVzYl9kdmI6IGR2Yl9uZXRfaW5pdCBmYWlsZWQhXG4iKTsKIAkJZHZiX2RteGRldl9yZWxlYXNlKCZ0dHVzYi0+ZG14ZGV2KTsKIAkJZHZiX2RteF9yZWxlYXNlKCZ0dHVzYi0+ZHZiX2RlbXV4KTsKIAkJaTJjX2RlbF9hZGFwdGVyKCZ0dHVzYi0+aTJjX2FkYXApOwotCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyICh0dHVzYi0+YWRhcHRlcik7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKCZ0dHVzYi0+YWRhcHRlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTU1OSw3ICsxNTU5LDcgQEAKIAlkdmJfZG14X3JlbGVhc2UoJnR0dXNiLT5kdmJfZGVtdXgpOwogCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkgZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQodHR1c2ItPmZlKTsKIAlpMmNfZGVsX2FkYXB0ZXIoJnR0dXNiLT5pMmNfYWRhcCk7Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcih0dHVzYi0+YWRhcHRlcik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmdHR1c2ItPmFkYXB0ZXIpOwogCiAJdHR1c2JfZnJlZV9pc29fdXJicyh0dHVzYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA2NGU3NzFiLi41MDViZGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC05OCw3ICs5OCw3IEBACiAJaW50CQkJCWNhbl9wbGF5YmFjazsKIAogCS8qIERWQiBiaXRzICovCi0Jc3RydWN0IGR2Yl9hZGFwdGVyCQkqYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIJCWFkYXB0ZXI7CiAJc3RydWN0IGRteGRldgkJCWRteGRldjsKIAlzdHJ1Y3QgZHZiX2RlbXV4CQlkZW11eDsKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kCQlmcm9udGVuZDsKQEAgLTE0MzUsNyArMTQzNSw3IEBACiAJCXByaW50aygiJXM6IGR2Yl9kbXhfaW5pdCBmYWlsZWQ6IGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSAgICAgICByZXN1bHQpOwogCi0JCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZGVjLT5hZGFwdGVyKTsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZGVjLT5hZGFwdGVyKTsKIAogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTE0NDQsMTIgKzE0NDQsMTIgQEAKIAlkZWMtPmRteGRldi5kZW11eCA9ICZkZWMtPmRlbXV4LmRteDsKIAlkZWMtPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwogCi0JaWYgKChyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJmRlYy0+ZG14ZGV2LCBkZWMtPmFkYXB0ZXIpKSA8IDApIHsKKwlpZiAoKHJlc3VsdCA9IGR2Yl9kbXhkZXZfaW5pdCgmZGVjLT5kbXhkZXYsICZkZWMtPmFkYXB0ZXIpKSA8IDApIHsKIAkJcHJpbnRrKCIlczogZHZiX2RteGRldl9pbml0IGZhaWxlZDogZXJyb3IgJWRcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CiAKIAkJZHZiX2RteF9yZWxlYXNlKCZkZWMtPmRlbXV4KTsKLQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkZWMtPmFkYXB0ZXIpOworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkZWMtPmFkYXB0ZXIpOwogCiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTQ2Myw3ICsxNDYzLDcgQEAKIAogCQlkdmJfZG14ZGV2X3JlbGVhc2UoJmRlYy0+ZG14ZGV2KTsKIAkJZHZiX2RteF9yZWxlYXNlKCZkZWMtPmRlbXV4KTsKLQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkZWMtPmFkYXB0ZXIpOworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkZWMtPmFkYXB0ZXIpOwogCiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTQ3NiwxMiArMTQ3NiwxMiBAQAogCQlkZWMtPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmRlYy0+ZGVtdXguZG14LCAmZGVjLT5mcm9udGVuZCk7CiAJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZGVjLT5kbXhkZXYpOwogCQlkdmJfZG14X3JlbGVhc2UoJmRlYy0+ZGVtdXgpOwotCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGRlYy0+YWRhcHRlcik7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmRlYy0+YWRhcHRlcik7CiAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlkdmJfbmV0X2luaXQoZGVjLT5hZGFwdGVyLCAmZGVjLT5kdmJfbmV0LCAmZGVjLT5kZW11eC5kbXgpOworCWR2Yl9uZXRfaW5pdCgmZGVjLT5hZGFwdGVyLCAmZGVjLT5kdmJfbmV0LCAmZGVjLT5kZW11eC5kbXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDk2LDcgKzE0OTYsNyBAQAogCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZGVjLT5kbXhkZXYpOwogCWR2Yl9kbXhfcmVsZWFzZSgmZGVjLT5kZW11eCk7CiAJaWYgKGRlYy0+ZmUpIGR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGRlYy0+ZmUpOwotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZGVjLT5hZGFwdGVyKTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkZWMtPmFkYXB0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCB0dHVzYl9kZWNfZXhpdF9yYyhzdHJ1Y3QgdHR1c2JfZGVjICpkZWMpCkBAIC0xNTY1LDE1ICsxNTY1LDE1IEBACiAJfQogfQogCi1pbnQgZmVfc2VuZF9jb21tYW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCB1OCBjb21tYW5kLAotCQkgICAgaW50IHBhcmFtX2xlbmd0aCwgY29uc3QgdTggcGFyYW1zW10sCi0JCSAgICBpbnQgKnJlc3VsdF9sZW5ndGgsIHU4IGNtZF9yZXN1bHRbXSkKK3N0YXRpYyBpbnQgZmVfc2VuZF9jb21tYW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCB1OCBjb21tYW5kLAorCQkJICAgaW50IHBhcmFtX2xlbmd0aCwgY29uc3QgdTggcGFyYW1zW10sCisJCQkgICBpbnQgKnJlc3VsdF9sZW5ndGgsIHU4IGNtZF9yZXN1bHRbXSkKIHsKIAlzdHJ1Y3QgdHR1c2JfZGVjKiBkZWMgPSAoc3RydWN0IHR0dXNiX2RlYyopIGZlLT5kdmItPnByaXY7CiAJcmV0dXJuIHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCBjb21tYW5kLCBwYXJhbV9sZW5ndGgsIHBhcmFtcywgcmVzdWx0X2xlbmd0aCwgY21kX3Jlc3VsdCk7CiB9CiAKLXN0cnVjdCB0dHVzYmRlY2ZlX2NvbmZpZyBmZV9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHR0dXNiZGVjZmVfY29uZmlnIGZlX2NvbmZpZyA9IHsKIAkuc2VuZF9jb21tYW5kID0gZmVfc2VuZF9jb21tYW5kCiB9OwogCkBAIC0xNjIwLDcgKzE2MjAsNyBAQAogCX0KIAl0dHVzYl9kZWNfaW5pdF9kdmIoZGVjKTsKIAotCWRlYy0+YWRhcHRlci0+cHJpdiA9IGRlYzsKKwlkZWMtPmFkYXB0ZXIucHJpdiA9IGRlYzsKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KGlkLT5pZFByb2R1Y3QpKSB7CiAJY2FzZSAweDEwMDY6CiAJCWRlYy0+ZmUgPSB0dHVzYmRlY2ZlX2R2YnNfYXR0YWNoKCZmZV9jb25maWcpOwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAkJICAgICAgIGxlMTZfdG9fY3B1KGRlYy0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCSAgICAgICBsZTE2X3RvX2NwdShkZWMtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CiAJfSBlbHNlIHsKLQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChkZWMtPmFkYXB0ZXIsIGRlYy0+ZmUpKSB7CisJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmRlYy0+YWRhcHRlciwgZGVjLT5mZSkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWNpOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7CiAJCQlpZiAoZGVjLT5mZS0+b3BzLT5yZWxlYXNlKQogCQkJCWRlYy0+ZmUtPm9wcy0+cmVsZWFzZShkZWMtPmZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCBkM2RkNDIyLi42YzA1ZmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0yNDAsNiArMjQwLDcgQEAKIAlzZWxlY3QgVklERU9fQlVGCiAJc2VsZWN0IFZJREVPX0lSCiAJc2VsZWN0IFZJREVPX1RVTkVSCisJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyBTQUE3MTMwLzcxMzQgYmFzZWQKIAkgIFRWIGNhcmRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYwppbmRleCA4NTIyNGI5Li42MzM0MTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYwpAQCAtMTk0Niw3ICsxOTQ2LDYgQEAKICAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAotICAgICAgICAubm9fdmlkZW8gICAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCmluZGV4IGUzZjQ3N2QuLmMyMzY4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKQEAgLTM2Myw2ICszNjMsOSBAQAogLyogcmVhZCBFRVBST00gY29udGVudCAqLwogdm9pZCBfX2RldmluaXQgYnR0dl9yZWFkZWUoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgYWRkcikKIHsKKwltZW1zZXQoZWVkYXRhLCAwLCAyNTYpOworCWlmICgwICE9IGJ0di0+aTJjX3JjKQorCQlyZXR1cm47CiAJYnR2LT5pMmNfY2xpZW50LmFkZHIgPSBhZGRyID4+IDE7CiAJdHZlZXByb21fcmVhZCgmYnR2LT5pMmNfY2xpZW50LCBlZWRhdGEsIDI1Nik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKaW5kZXggZmU2YWJlMy4uMWRiMDIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwpAQCAtNDMsMTUgKzQzLDE1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0X3RhYmxlW10gPQogewogCVtTQUE2NzUySFNfVkZfRDFdID0gewotCQkuZm10LnBpeC53aWR0aCA9IDcyMCwgLmZtdC5waXguaGVpZ2h0ID0gNTc2IH0sCisJCS5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDcyMCwgLmhlaWdodCA9IDU3NiB9LCB9LCB9LAogCVtTQUE2NzUySFNfVkZfMl8zX0QxXSA9IHsKLQkJLmZtdC5waXgud2lkdGggPSA0ODAsIC5mbXQucGl4LmhlaWdodCA9IDU3NiB9LAorCQkuZm10ID0geyAucGl4ID0geyAud2lkdGggPSA0ODAsIC5oZWlnaHQgPSA1NzYgfSwgfSwgfSwKIAlbU0FBNjc1MkhTX1ZGXzFfMl9EMV0gPSB7Ci0JCS5mbXQucGl4LndpZHRoID0gMzUyLCAuZm10LnBpeC5oZWlnaHQgPSA1NzYgfSwKKwkJLmZtdCA9IHsgLnBpeCA9IHsgLndpZHRoID0gMzUyLCAuaGVpZ2h0ID0gNTc2IH0sIH0sIH0sCiAJW1NBQTY3NTJIU19WRl9TSUZdID0gewotCQkuZm10LnBpeC53aWR0aCA9IDM1MiwgLmZtdC5waXguaGVpZ2h0ID0gMjg4IH0sCisJCS5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDM1MiwgLmhlaWdodCA9IDI4OCB9LCB9LCB9LAogCVtTQUE2NzUySFNfVkZfVU5LTk9XTl0gPSB7Ci0JCS5mbXQucGl4LndpZHRoID0gMCwgLmZtdC5waXguaGVpZ2h0ID0gMH0sCisJCS5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDAsIC5oZWlnaHQgPSAwIH0sIH0sIH0sCiB9OwogCiBzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKaW5kZXggMzFjYzRlZC4uNWY4NzAwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTE0OSwxMCArMTQ5LDEwIEBACiAJCSAgICAgICBkdmItPm5hbWUsIHJlc3VsdCk7CiAJCWdvdG8gZmFpbF9hZGFwdGVyOwogCX0KLQlkdmItPmFkYXB0ZXItPnByaXYgPSBhZGFwdGVyX3ByaXY7CisJZHZiLT5hZGFwdGVyLnByaXYgPSBhZGFwdGVyX3ByaXY7CiAKIAkvKiByZWdpc3RlciBmcm9udGVuZCAqLwotCXJlc3VsdCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChkdmItPmFkYXB0ZXIsIGR2Yi0+ZnJvbnRlbmQpOworCXJlc3VsdCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZHZiLT5hZGFwdGVyLCBkdmItPmZyb250ZW5kKTsKIAlpZiAocmVzdWx0IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHZiX3JlZ2lzdGVyX2Zyb250ZW5kIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsCiAJCSAgICAgICBkdmItPm5hbWUsIHJlc3VsdCk7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAlkdmItPmRteGRldi5maWx0ZXJudW0gICAgPSAyNTY7CiAJZHZiLT5kbXhkZXYuZGVtdXggICAgICAgID0gJmR2Yi0+ZGVtdXguZG14OwogCWR2Yi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7Ci0JcmVzdWx0ID0gZHZiX2RteGRldl9pbml0KCZkdmItPmRteGRldiwgZHZiLT5hZGFwdGVyKTsKKwlyZXN1bHQgPSBkdmJfZG14ZGV2X2luaXQoJmR2Yi0+ZG14ZGV2LCAmZHZiLT5hZGFwdGVyKTsKIAlpZiAocmVzdWx0IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHZiX2RteGRldl9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsCiAJCSAgICAgICBkdmItPm5hbWUsIHJlc3VsdCk7CkBAIC0yMDksNyArMjA5LDcgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBuZXR3b3JrIGFkYXB0ZXIgKi8KLQlkdmJfbmV0X2luaXQoZHZiLT5hZGFwdGVyLCAmZHZiLT5uZXQsICZkdmItPmRlbXV4LmRteCk7CisJZHZiX25ldF9pbml0KCZkdmItPmFkYXB0ZXIsICZkdmItPm5ldCwgJmR2Yi0+ZGVtdXguZG14KTsKIAlyZXR1cm4gMDsKIAogZmFpbF9mZV9jb25uOgpAQCAtMjIzLDcgKzIyMyw3IEBACiBmYWlsX2RteDoKIAlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKIGZhaWxfZnJvbnRlbmQ6Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkdmItPmFkYXB0ZXIpOworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7CiBmYWlsX2FkYXB0ZXI6CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIzNiw3ICsyMzYsNyBAQAogCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZHZiLT5kbXhkZXYpOwogCWR2Yl9kbXhfcmVsZWFzZSgmZHZiLT5kZW11eCk7CiAJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkdmItPmFkYXB0ZXIpOworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7CiB9CiAKIEVYUE9SVF9TWU1CT0wodmlkZW9idWZfZHZiX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL0tjb25maWcgYi9kcml2ZXJzL21tYy9LY29uZmlnCmluZGV4IDJlNzBkNzQuLjQ5OTFiYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvS2NvbmZpZwpAQCAtNTEsNyArNTEsNyBAQAogCiBjb25maWcgTU1DX1dCU0QKIAl0cmlzdGF0ZSAiV2luYm9uZCBXODNMNTF4RCBTRC9NTUMgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1NQyAmJiBJU0EgJiYgSVNBX0RNQV9BUEkKKwlkZXBlbmRzIG9uIE1NQyAmJiBJU0FfRE1BX0FQSQogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgV2luYm9uZChSKSBXODNMNTF4RCBTZWN1cmUgZGlnaXRhbCBhbmQKICAgICAgICAgICBNdWx0aW1lZGlhIGNhcmQgSW50ZXJmYWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwppbmRleCBiNWI0YTdiLi5kNGVlZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwpAQCAtMzgzLDcgKzM4MywxMCBAQAogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kOwogCWludCBlcnI7CiAKLQlpZiAoY2FyZC0+Y3NkLmNtZGNsYXNzICYgfjB4MWZmKQorCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgY2FyZCBzdXBwb3J0cyB0aGUgY29tbWFuZCBjbGFzcyhlcykgd2UgbmVlZC4KKwkgKi8KKwlpZiAoIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfQkxPQ0tfUkVBRCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMgPCA5KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmMgYi9kcml2ZXJzL21tYy93YnNkLmMKaW5kZXggMzk3NDc1Mi4uYjdmYmQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuYwpAQCAtMjgsNyArMjgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvcHJvdG9jb2wuaD4KQEAgLTQwLDcgKzQyLDcgQEAKICNpbmNsdWRlICJ3YnNkLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIndic2QiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjIiCiAKICNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCiAjZGVmaW5lIERCRyh4Li4uKSBcCkBAIC01MiwxMCArNTQsNiBAQAogI2RlZmluZSBEQkdGKHguLi4pCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlvID0gMHgyNDg7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlycSA9IDY7Ci1zdGF0aWMgaW50IGRtYSA9IDI7Ci0KICNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCiB2b2lkIERCR19SRUcoaW50IHJlZywgdTggdmFsdWUpCiB7CkBAIC03OSwyOCArNzcsNjEgQEAKICNlbmRpZgogCiAvKgorICogRGV2aWNlIHJlc291cmNlcworICovCisKKyNpZmRlZiBDT05GSUdfUE5QCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfZGV2X3RhYmxlW10gPSB7CisJeyAiV0VDMDUxNyIsIDAgfSwKKwl7ICJXRUMwNTE4IiwgMCB9LAorCXsgIiIsIDAgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBwbnBfZGV2X3RhYmxlKTsKKworI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKworI2lmZGVmIENPTkZJR19QTlAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9wbnAgPSAwOworI2Vsc2UKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9wbnAgPSAxOworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IGlvID0gMHgyNDg7CitzdGF0aWMgdW5zaWduZWQgaW50IGlycSA9IDY7CitzdGF0aWMgaW50IGRtYSA9IDI7CisKKy8qCiAgKiBCYXNpYyBmdW5jdGlvbnMKICAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF91bmxvY2tfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCiB7CisJQlVHX09OKGhvc3QtPmNvbmZpZyA9PSAwKTsKKwkKIAlvdXRiKGhvc3QtPnVubG9ja19jb2RlLCBob3N0LT5jb25maWcpOwogCW91dGIoaG9zdC0+dW5sb2NrX2NvZGUsIGhvc3QtPmNvbmZpZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2xvY2tfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCiB7CisJQlVHX09OKGhvc3QtPmNvbmZpZyA9PSAwKTsKKwkKIAlvdXRiKExPQ0tfQ09ERSwgaG9zdC0+Y29uZmlnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHdic2Rfd3JpdGVfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIHU4IHJlZywgdTggdmFsdWUpCiB7CisJQlVHX09OKGhvc3QtPmNvbmZpZyA9PSAwKTsKKwkKIAlvdXRiKHJlZywgaG9zdC0+Y29uZmlnKTsKIAlvdXRiKHZhbHVlLCBob3N0LT5jb25maWcgKyAxKTsKIH0KIAogc3RhdGljIGlubGluZSB1OCB3YnNkX3JlYWRfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIHU4IHJlZykKIHsKKwlCVUdfT04oaG9zdC0+Y29uZmlnID09IDApOworCQogCW91dGIocmVnLCBob3N0LT5jb25maWcpOwogCXJldHVybiBpbmIoaG9zdC0+Y29uZmlnICsgMSk7CiB9CkBAIC0xMzMsNiArMTY0LDEzIEBACiAJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9TRVRVUCwgc2V0dXApOwogCQogCS8qCisJICogU2V0IERBVDMgdG8gaW5wdXQKKwkgKi8KKwlzZXR1cCAmPSB+V0JTRF9EQVQzX0g7CisJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9TRVRVUCwgc2V0dXApOworCWhvc3QtPmZsYWdzICY9IH5XQlNEX0ZJR05PUkVfREVURUNUOworCQorCS8qCiAJICogUmVhZCBiYWNrIGRlZmF1bHQgY2xvY2suCiAJICovCiAJaG9zdC0+Y2xrID0gd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX0NMSyk7CkBAIC0xNDgsNiArMTg2LDE0IEBACiAJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9UQUFDLCAweDdGKTsKIAkKIAkvKgorCSAqIFRlc3QgZm9yIGNhcmQgcHJlc2VuY2UKKwkgKi8KKwlpZiAoaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUikgJiBXQlNEX0NBUkRQUkVTRU5UKQorCQlob3N0LT5mbGFncyB8PSBXQlNEX0ZDQVJEX1BSRVNFTlQ7CisJZWxzZQorCQlob3N0LT5mbGFncyAmPSB+V0JTRF9GQ0FSRF9QUkVTRU5UOworCQorCS8qCiAJICogRW5hYmxlIGludGVyZXN0aW5nIGludGVycnVwdHMuCiAJICovCiAJaWVyID0gMDsKQEAgLTQwNyw4ICs0NTMsNiBAQAogCX0KIH0KIAotc3RhdGljIGlycXJldHVybl90IHdic2RfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCiBzdGF0aWMgdm9pZCB3YnNkX3NlbmRfY29tbWFuZChzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQqIGNtZCkKIHsKIAlpbnQgaTsKQEAgLTY0Niw2ICs2OTAsMTMgQEAKIAl9CiAJCiAJd2JzZF9rdW5tYXBfc2coaG9zdCk7CisJCisJLyoKKwkgKiBUaGUgY29udHJvbGxlciBzdG9wcyBzZW5kaW5nIGludGVycnVwdHMgZm9yCisJICogJ0ZJRk8gZW1wdHknIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gU28gd2UKKwkgKiBuZWVkIHRvIGJlIGEgYml0IG1vcmUgcHJvLWFjdGl2ZS4KKwkgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5maWZvX3Rhc2tsZXQpOwogfQogCiBzdGF0aWMgdm9pZCB3YnNkX3ByZXBhcmVfZGF0YShzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCBzdHJ1Y3QgbW1jX2RhdGEqIGRhdGEpCkBAIC04NTAsOSArOTAxLDExIEBACiAJd2JzZF9yZXF1ZXN0X2VuZChob3N0LCBob3N0LT5tcnEpOwogfQogCi0vKgotICogTU1DIENhbGxiYWNrcwotICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIE1NQyBsYXllciBjYWxsYmFja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkIHdic2RfcmVxdWVzdChzdHJ1Y3QgbW1jX2hvc3QqIG1tYywgc3RydWN0IG1tY19yZXF1ZXN0KiBtcnEpCiB7CkBAIC04NzQsNyArOTI3LDcgQEAKIAkgKiBJZiB0aGVyZSBpcyBubyBjYXJkIGluIHRoZSBzbG90IHRoZW4KIAkgKiB0aW1lb3V0IGltbWVkaWF0bHkuCiAJICovCi0JaWYgKCEoaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUikgJiBXQlNEX0NBUkRQUkVTRU5UKSkKKwlpZiAoIShob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkpCiAJewogCQljbWQtPmVycm9yID0gTU1DX0VSUl9USU1FT1VUOwogCQlnb3RvIGRvbmU7CkBAIC05NTMsMzMgKzEwMDYsNTAgQEAKIAkJaG9zdC0+Y2xrID0gY2xrOwogCX0KIAorCS8qCisJICogUG93ZXIgdXAgY2FyZC4KKwkgKi8KIAlpZiAoaW9zLT5wb3dlcl9tb2RlICE9IE1NQ19QT1dFUl9PRkYpCiAJewotCQkvKgotCQkgKiBQb3dlciB1cCBjYXJkLgotCQkgKi8KIAkJcHdyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUik7CiAJCXB3ciAmPSB+V0JTRF9QT1dFUl9OOwogCQlvdXRiKHB3ciwgaG9zdC0+YmFzZSArIFdCU0RfQ1NSKTsKLQotCQkvKgotCQkgKiBUaGlzIGJlaGF2aW91ciBpcyBzdG9sZW4gZnJvbSB0aGUKLQkJICogV2luZG93cyBkcml2ZXIuIERvbid0IGtub3cgd2h5LCBidXQKLQkJICogaXQgaXMgbmVlZGVkLgotCQkgKi8KLQkJc2V0dXAgPSB3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfU0VUVVApOwotCQlpZiAoaW9zLT5idXNfbW9kZSA9PSBNTUNfQlVTTU9ERV9PUEVORFJBSU4pCi0JCQlzZXR1cCB8PSBXQlNEX0RBVDNfSDsKLQkJZWxzZQotCQkJc2V0dXAgJj0gfldCU0RfREFUM19IOwotCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7Ci0KLQkJbWRlbGF5KDEpOwogCX0KIAorCS8qCisJICogTU1DIGNhcmRzIG5lZWQgdG8gaGF2ZSBwaW4gMSBoaWdoIGR1cmluZyBpbml0LgorCSAqIEluaXQgdGltZSBjb3JyZXNwb25kcyByYXRoZXIgbmljZWx5IHdpdGggdGhlIGJ1cyBtb2RlLgorCSAqIEl0IHdyZWFrcyBoYXZvYyB3aXRoIHRoZSBjYXJkIGRldGVjdGlvbiB0aG91Z2ggc28KKwkgKiB0aGF0IG5lZWRzIHRvIGJlIGRpc2FiZWQuCisJICovCisJc2V0dXAgPSB3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfU0VUVVApOworCWlmICgoaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikgJiYKKwkJKGlvcy0+YnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOKSkKKwl7CisJCXNldHVwIHw9IFdCU0RfREFUM19IOworCQlob3N0LT5mbGFncyB8PSBXQlNEX0ZJR05PUkVfREVURUNUOworCX0KKwllbHNlCisJeworCQlzZXR1cCAmPSB+V0JTRF9EQVQzX0g7CisJCWhvc3QtPmZsYWdzICY9IH5XQlNEX0ZJR05PUkVfREVURUNUOworCX0KKwl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7CisJCiAJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwogfQogCitzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyB3YnNkX29wcyA9IHsKKwkucmVxdWVzdAk9IHdic2RfcmVxdWVzdCwKKwkuc2V0X2lvcwk9IHdic2Rfc2V0X2lvcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW50ZXJydXB0IGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyoKICAqIFRhc2tsZXRzCiAgKi8KQEAgLTEwMDUsMTcgKzEwNzUsMzMgQEAKIHsKIAlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKXBhcmFtOwogCXU4IGNzcjsKKwlpbnQgY2hhbmdlID0gMDsKIAkKIAlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogCQorCWlmIChob3N0LT5mbGFncyAmIFdCU0RfRklHTk9SRV9ERVRFQ1QpCisJeworCQlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJCXJldHVybjsKKwl9CisJCiAJY3NyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUik7CiAJV0FSTl9PTihjc3IgPT0gMHhmZik7CiAJCiAJaWYgKGNzciAmIFdCU0RfQ0FSRFBSRVNFTlQpCi0JCURCRygiQ2FyZCBpbnNlcnRlZFxuIik7Ci0JZWxzZQorCXsKKwkJaWYgKCEoaG9zdC0+ZmxhZ3MgJiBXQlNEX0ZDQVJEX1BSRVNFTlQpKQorCQl7CisJCQlEQkcoIkNhcmQgaW5zZXJ0ZWRcbiIpOworCQkJaG9zdC0+ZmxhZ3MgfD0gV0JTRF9GQ0FSRF9QUkVTRU5UOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKwllbHNlIGlmIChob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkKIAl7CiAJCURCRygiQ2FyZCByZW1vdmVkXG4iKTsKKwkJaG9zdC0+ZmxhZ3MgJj0gfldCU0RfRkNBUkRfUFJFU0VOVDsKKwkJY2hhbmdlID0gMTsKIAkJCiAJCWlmIChob3N0LT5tcnEpCiAJCXsKQEAgLTEwMzMsNyArMTExOSw4IEBACiAJICovCiAJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCi0JbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jKTsKKwlpZiAoY2hhbmdlKQorCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMpOwogfQogCiBzdGF0aWMgdm9pZCB3YnNkX3Rhc2tsZXRfZmlmbyh1bnNpZ25lZCBsb25nIHBhcmFtKQpAQCAtMTIwMCwxMSArMTI4Nyw4NSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXZpY2UgaW5pdGlhbGlzYXRpb24gYW5kIHNodXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAvKgotICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHByb2JlCisgKiBBbGxvY2F0ZS9mcmVlIE1NQyBzdHJ1Y3R1cmUuCiAgKi8KIAotc3RhdGljIGludCB3YnNkX3NjYW4oc3RydWN0IHdic2RfaG9zdCogaG9zdCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfYWxsb2NfbW1jKHN0cnVjdCBkZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgbW1jX2hvc3QqIG1tYzsKKwlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0OworCQorCS8qCisJICogQWxsb2NhdGUgTU1DIHN0cnVjdHVyZS4KKwkgKi8KKwltbWMgPSBtbWNfYWxsb2NfaG9zdChzaXplb2Yoc3RydWN0IHdic2RfaG9zdCksIGRldik7CisJaWYgKCFtbWMpCisJCXJldHVybiAtRU5PTUVNOworCQorCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCWhvc3QtPm1tYyA9IG1tYzsKKworCWhvc3QtPmRtYSA9IC0xOworCisJLyoKKwkgKiBTZXQgaG9zdCBwYXJhbWV0ZXJzLgorCSAqLworCW1tYy0+b3BzID0gJndic2Rfb3BzOworCW1tYy0+Zl9taW4gPSAzNzUwMDA7CisJbW1jLT5mX21heCA9IDI0MDAwMDAwOworCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0OworCQorCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKKwkKKwkvKgorCSAqIE1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzLiBXb3JzdCBjYXNlIGlzIG9uZSBzZWN0b3IgcGVyIHNlZ21lbnQKKwkgKiBzbyB0aGlzIHdpbGwgYmUgNjRrQi81MTIuCisJICovCisJbW1jLT5tYXhfaHdfc2VncyA9IDEyODsKKwltbWMtPm1heF9waHlzX3NlZ3MgPSAxMjg7CisJCisJLyoKKwkgKiBNYXhpbXVtIG51bWJlciBvZiBzZWN0b3JzIGluIG9uZSB0cmFuc2Zlci4gQWxzbyBsaW1pdGVkIGJ5IDY0a0IKKwkgKiBidWZmZXIuCisJICovCisJbW1jLT5tYXhfc2VjdG9ycyA9IDEyODsKKwkKKwkvKgorCSAqIE1heGltdW0gc2VnbWVudCBzaXplLiBDb3VsZCBiZSBvbmUgc2VnbWVudCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlcgorCSAqIG9mIHNlZ21lbnRzLgorCSAqLworCW1tYy0+bWF4X3NlZ19zaXplID0gbW1jLT5tYXhfc2VjdG9ycyAqIDUxMjsKKwkKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBtbWMpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9mcmVlX21tYyhzdHJ1Y3QgZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IG1tY19ob3N0KiBtbWM7CisJCisJbW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCFtbWMpCisJCXJldHVybjsKKwkKKwltbWNfZnJlZV9ob3N0KG1tYyk7CisJCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKy8qCisgKiBTY2FuIGZvciBrbm93biBjaGlwIGlkOnMKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX3NjYW4oc3RydWN0IHdic2RfaG9zdCogaG9zdCkKIHsKIAlpbnQgaSwgaiwgazsKIAlpbnQgaWQ7CkBAIC0xMjU4LDEyICsxNDE5LDE2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQgd2JzZF9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IHdic2RfaG9zdCogaG9zdCkKKy8qCisgKiBBbGxvY2F0ZS9mcmVlIGlvIHBvcnQgcmFuZ2VzCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCBpbnQgYmFzZSkKIHsKIAlpZiAoaW8gJiAweDcpCiAJCXJldHVybiAtRUlOVkFMOwogCQotCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDgsIERSSVZFUl9OQU1FKSkKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDgsIERSSVZFUl9OQU1FKSkKIAkJcmV0dXJuIC1FSU87CiAJCiAJaG9zdC0+YmFzZSA9IGlvOwpAQCAtMTI3MSwxOSArMTQzNiwyNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB3YnNkX3JlbGVhc2VfcmVnaW9ucyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCiB7CiAJaWYgKGhvc3QtPmJhc2UpCiAJCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmJhc2UsIDgpOworCQorCWhvc3QtPmJhc2UgPSAwOwogCiAJaWYgKGhvc3QtPmNvbmZpZykKIAkJcmVsZWFzZV9yZWdpb24oaG9zdC0+Y29uZmlnLCAyKTsKKwkKKwlob3N0LT5jb25maWcgPSAwOwogfQogCi1zdGF0aWMgdm9pZCB3YnNkX2luaXRfZG1hKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCisvKgorICogQWxsb2NhdGUvZnJlZSBETUEgcG9ydCBhbmQgYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9kbWEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgaW50IGRtYSkKIHsKLQlob3N0LT5kbWEgPSAtMTsKLQkKIAlpZiAoZG1hIDwgMCkKIAkJcmV0dXJuOwogCQpAQCAtMTI5NCw3ICsxNDY1LDcgQEAKIAkgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgc3BlY2lhbCBidWZmZXIgaW4KIAkgKiBvcmRlciBmb3IgSVNBIHRvIGJlIGFibGUgdG8gRE1BIHRvIGl0LgogCSAqLwotCWhvc3QtPmRtYV9idWZmZXIgPSBrbWFsbG9jKDY1NTM2LAorCWhvc3QtPmRtYV9idWZmZXIgPSBrbWFsbG9jKFdCU0RfRE1BX1NJWkUsCiAJCUdGUF9OT0lPIHwgR0ZQX0RNQSB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX05PV0FSTik7CiAJaWYgKCFob3N0LT5kbWFfYnVmZmVyKQogCQlnb3RvIGZyZWU7CkBAIC0xMzAyLDcgKzE0NzMsOCBAQAogCS8qCiAJICogVHJhbnNsYXRlIHRoZSBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4KIAkgKi8KLQlob3N0LT5kbWFfYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhob3N0LT5kbWFfYnVmZmVyKTsKKwlob3N0LT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYnVmZmVyLAorCQlXQlNEX0RNQV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAJCQkKIAkvKgogCSAqIElTQSBETUEgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNjRrIGJhc2lzLgpAQCAtMTMyNSw2ICsxNDk3LDEwIEBACiAJICovCiAJQlVHX09OKDEpOwogCQorCWRtYV91bm1hcF9zaW5nbGUoaG9zdC0+bW1jLT5kZXYsIGhvc3QtPmRtYV9hZGRyLCBXQlNEX0RNQV9TSVpFLAorCQlETUFfQklESVJFQ1RJT05BTCk7CisJaG9zdC0+ZG1hX2FkZHIgPSAoZG1hX2FkZHJfdClOVUxMOworCQogCWtmcmVlKGhvc3QtPmRtYV9idWZmZXIpOwogCWhvc3QtPmRtYV9idWZmZXIgPSBOVUxMOwogCkBAIC0xMzM2LDg2ICsxNTEyLDM5IEBACiAJCSJGYWxsaW5nIGJhY2sgb24gRklGTy5cbiIsIGRtYSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHdic2Rfb3BzID0gewotCS5yZXF1ZXN0CT0gd2JzZF9yZXF1ZXN0LAotCS5zZXRfaW9zCT0gd2JzZF9zZXRfaW9zLAotfTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3YnNkX3JlbGVhc2VfZG1hKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCit7CisJaWYgKGhvc3QtPmRtYV9hZGRyKQorCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwgV0JTRF9ETUFfU0laRSwKKwkJCURNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoaG9zdC0+ZG1hX2J1ZmZlcikKKwkJa2ZyZWUoaG9zdC0+ZG1hX2J1ZmZlcik7CisJaWYgKGhvc3QtPmRtYSA+PSAwKQorCQlmcmVlX2RtYShob3N0LT5kbWEpOworCQorCWhvc3QtPmRtYSA9IC0xOworCWhvc3QtPmRtYV9idWZmZXIgPSBOVUxMOworCWhvc3QtPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpTlVMTDsKK30KIAogLyoKLSAqIERldmljZSBwcm9iZQorICogQWxsb2NhdGUvZnJlZSBJUlEuCiAgKi8KIAotc3RhdGljIGludCB3YnNkX3Byb2JlKHN0cnVjdCBkZXZpY2UqIGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9pcnEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgaW50IGlycSkKIHsKLQlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0ID0gTlVMTDsKLQlzdHJ1Y3QgbW1jX2hvc3QqIG1tYyA9IE5VTEw7CiAJaW50IHJldDsKIAkKIAkvKgotCSAqIEFsbG9jYXRlIE1NQyBzdHJ1Y3R1cmUuCi0JICovCi0JbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCB3YnNkX2hvc3QpLCBkZXYpOwotCWlmICghbW1jKQotCQlyZXR1cm4gLUVOT01FTTsKLQkKLQlob3N0ID0gbW1jX3ByaXYobW1jKTsKLQlob3N0LT5tbWMgPSBtbWM7Ci0JCi0JLyoKLQkgKiBTY2FuIGZvciBoYXJkd2FyZS4KLQkgKi8KLQlyZXQgPSB3YnNkX3NjYW4oaG9zdCk7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlbW1jOwotCi0JLyoKLQkgKiBSZXNldCB0aGUgY2hpcC4KLQkgKi8JCi0Jd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX1NXUlNULCAxKTsKLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfU1dSU1QsIDApOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBJL08gcG9ydHMuCi0JICovCi0JcmV0ID0gd2JzZF9yZXF1ZXN0X3JlZ2lvbnMoaG9zdCk7Ci0JaWYgKHJldCkKLQkJZ290byByZWxlYXNlOwotCi0JLyoKLQkgKiBTZXQgaG9zdCBwYXJhbWV0ZXJzLgotCSAqLwotCW1tYy0+b3BzID0gJndic2Rfb3BzOwotCW1tYy0+Zl9taW4gPSAzNzUwMDA7Ci0JbW1jLT5mX21heCA9IDI0MDAwMDAwOwotCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0OwotCQotCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKLQotCS8qCi0JICogU2VsZWN0IFNEL01NQyBmdW5jdGlvbi4KLQkgKi8KLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfREVWSUNFLCBERVZJQ0VfU0QpOwotCQotCS8qCi0JICogU2V0IHVwIGNhcmQgZGV0ZWN0aW9uLgotCSAqLwotCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9QSU5TLCAweDAyKTsKLQkKLQkvKgotCSAqIENvbmZpZ3VyZSBJL08gcG9ydC4KLQkgKi8KLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE9SVF9ISSwgaG9zdC0+YmFzZSA+PiA4KTsKLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE9SVF9MTywgaG9zdC0+YmFzZSAmIDB4ZmYpOwotCi0JLyoKIAkgKiBBbGxvY2F0ZSBpbnRlcnJ1cHQuCiAJICovCisKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHdic2RfaXJxLCBTQV9TSElSUSwgRFJJVkVSX05BTUUsIGhvc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gcmVsZWFzZTsKKwkJcmV0dXJuIHJldDsKIAkKIAlob3N0LT5pcnEgPSBpcnE7Ci0JCisKIAkvKgogCSAqIFNldCB1cCB0YXNrbGV0cy4KIAkgKi8KQEAgLTE0MjYsMTM4ICsxNTU1LDMyMyBAQAogCXRhc2tsZXRfaW5pdCgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQsIHdic2RfdGFza2xldF9maW5pc2gsICh1bnNpZ25lZCBsb25nKWhvc3QpOwogCXRhc2tsZXRfaW5pdCgmaG9zdC0+YmxvY2tfdGFza2xldCwgd2JzZF90YXNrbGV0X2Jsb2NrLCAodW5zaWduZWQgbG9uZylob3N0KTsKIAkKLQkvKgotCSAqIENvbmZpZ3VyZSBpbnRlcnJ1cHQuCi0JICovCi0Jd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX0lSUSwgaG9zdC0+aXJxKTsKLQkKLQkvKgotCSAqIEFsbG9jYXRlIERNQS4KLQkgKi8KLQl3YnNkX2luaXRfZG1hKGhvc3QpOwotCQotCS8qCi0JICogSWYgYWxsIHdlbnQgd2VsbCwgdGhlbiBjb25maWd1cmUgRE1BLgotCSAqLwotCWlmIChob3N0LT5kbWEgPj0gMCkKLQkJd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX0RSUSwgaG9zdC0+ZG1hKTsKLQkKLQkvKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzLiBXb3JzdCBjYXNlIGlzIG9uZSBzZWN0b3IgcGVyIHNlZ21lbnQKLQkgKiBzbyB0aGlzIHdpbGwgYmUgNjRrQi81MTIuCi0JICovCi0JbW1jLT5tYXhfaHdfc2VncyA9IDEyODsKLQltbWMtPm1heF9waHlzX3NlZ3MgPSAxMjg7Ci0JCi0JLyoKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBzZWN0b3JzIGluIG9uZSB0cmFuc2Zlci4gQWxzbyBsaW1pdGVkIGJ5IDY0a0IKLQkgKiBidWZmZXIuCi0JICovCi0JbW1jLT5tYXhfc2VjdG9ycyA9IDEyODsKLQkKLQkvKgotCSAqIE1heGltdW0gc2VnbWVudCBzaXplLiBDb3VsZCBiZSBvbmUgc2VnbWVudCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlcgotCSAqIG9mIHNlZ21lbnRzLgotCSAqLwotCW1tYy0+bWF4X3NlZ19zaXplID0gbW1jLT5tYXhfc2VjdG9ycyAqIDUxMjsKLQkKLQkvKgotCSAqIEVuYWJsZSBjaGlwLgotCSAqLwotCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9FTkFCTEUsIDEpOwotCQotCS8qCi0JICogUG93ZXIgdXAgY2hpcC4KLQkgKi8KLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE9XRVIsIDB4MjApOwotCQotCS8qCi0JICogUG93ZXIgTWFuYWdlbWVudCBzdHVmZi4gTm8gaWRlYSBob3cgdGhpcyB3b3Jrcy4KLQkgKiBOb3QgdGVzdGVkLgotCSAqLwotI2lmZGVmIENPTkZJR19QTQotCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9QTUUsIDB4QTApOwotI2VuZGlmCi0KLQkvKgotCSAqIFJlc2V0IHRoZSBjaGlwIGludG8gYSBrbm93biBzdGF0ZS4KLQkgKi8KLQl3YnNkX2luaXRfZGV2aWNlKGhvc3QpOwotCQotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1tYyk7Ci0JCi0JLyoKLQkgKiBBZGQgaG9zdCB0byBNTUMgbGF5ZXIuCi0JICovCi0JbW1jX2FkZF9ob3N0KG1tYyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlczogVzgzTDUxeEQgaWQgJXggYXQgMHgleCBpcnEgJWQgZG1hICVkXG4iLAotCQltbWMtPmhvc3RfbmFtZSwgKGludClob3N0LT5jaGlwX2lkLCAoaW50KWhvc3QtPmJhc2UsCi0JCShpbnQpaG9zdC0+aXJxLCAoaW50KWhvc3QtPmRtYSk7Ci0KIAlyZXR1cm4gMDsKLQotcmVsZWFzZToKLQl3YnNkX3JlbGVhc2VfcmVnaW9ucyhob3N0KTsKLQotZnJlZW1tYzoKLQltbWNfZnJlZV9ob3N0KG1tYyk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRGV2aWNlIHJlbW92ZQotICovCi0KLXN0YXRpYyBpbnQgd2JzZF9yZW1vdmUoc3RydWN0IGRldmljZSogZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9pcnEoc3RydWN0IHdic2RfaG9zdCogaG9zdCkKIHsKLQlzdHJ1Y3QgbW1jX2hvc3QqIG1tYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3Q7Ci0JCi0JaWYgKCFtbWMpCi0JCXJldHVybiAwOwotCi0JaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0JCi0JLyoKLQkgKiBVbnJlZ2lzdGVyIGhvc3Qgd2l0aCBNTUMgbGF5ZXIuCi0JICovCi0JbW1jX3JlbW92ZV9ob3N0KG1tYyk7Ci0KLQkvKgotCSAqIFBvd2VyIGRvd24gdGhlIFNEL01NQyBmdW5jdGlvbi4KLQkgKi8KLQl3YnNkX3VubG9ja19jb25maWcoaG9zdCk7Ci0Jd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX0RFVklDRSwgREVWSUNFX1NEKTsKLQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfRU5BQkxFLCAwKTsKLQl3YnNkX2xvY2tfY29uZmlnKGhvc3QpOwotCQotCS8qCi0JICogRnJlZSByZXNvdXJjZXMuCi0JICovCi0JaWYgKGhvc3QtPmRtYV9idWZmZXIpCi0JCWtmcmVlKGhvc3QtPmRtYV9idWZmZXIpOwotCQotCWlmIChob3N0LT5kbWEgPj0gMCkKLQkJZnJlZV9kbWEoaG9zdC0+ZG1hKTsKKwlpZiAoIWhvc3QtPmlycSkKKwkJcmV0dXJuOwogCiAJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKIAkKKwlob3N0LT5pcnEgPSAwOworCQkKIAl0YXNrbGV0X2tpbGwoJmhvc3QtPmNhcmRfdGFza2xldCk7CiAJdGFza2xldF9raWxsKCZob3N0LT5maWZvX3Rhc2tsZXQpOwogCXRhc2tsZXRfa2lsbCgmaG9zdC0+Y3JjX3Rhc2tsZXQpOwogCXRhc2tsZXRfa2lsbCgmaG9zdC0+dGltZW91dF90YXNrbGV0KTsKIAl0YXNrbGV0X2tpbGwoJmhvc3QtPmZpbmlzaF90YXNrbGV0KTsKIAl0YXNrbGV0X2tpbGwoJmhvc3QtPmJsb2NrX3Rhc2tsZXQpOworfQorCisvKgorICogQWxsb2NhdGUgYWxsIHJlc291cmNlcyBmb3IgdGhlIGhvc3QuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LAorCWludCBiYXNlLCBpbnQgaXJxLCBpbnQgZG1hKQoreworCWludCByZXQ7CiAJCisJLyoKKwkgKiBBbGxvY2F0ZSBJL08gcG9ydHMuCisJICovCisJcmV0ID0gd2JzZF9yZXF1ZXN0X3JlZ2lvbihob3N0LCBiYXNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBBbGxvY2F0ZSBpbnRlcnJ1cHQuCisJICovCisJcmV0ID0gd2JzZF9yZXF1ZXN0X2lycShob3N0LCBpcnEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEFsbG9jYXRlIERNQS4KKwkgKi8KKwl3YnNkX3JlcXVlc3RfZG1hKGhvc3QsIGRtYSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBob3N0LgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3YnNkX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCit7CisJd2JzZF9yZWxlYXNlX2RtYShob3N0KTsKKwl3YnNkX3JlbGVhc2VfaXJxKGhvc3QpOwogCXdic2RfcmVsZWFzZV9yZWdpb25zKGhvc3QpOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSByZXNvdXJjZXMgdGhlIGNoaXAgc2hvdWxkIHVzZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgd2JzZF9jaGlwX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQoreworCS8qCisJICogUmVzZXQgdGhlIGNoaXAuCisJICovCQorCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9TV1JTVCwgMSk7CisJd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX1NXUlNULCAwKTsKKworCS8qCisJICogU2VsZWN0IFNEL01NQyBmdW5jdGlvbi4KKwkgKi8KKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfREVWSUNFLCBERVZJQ0VfU0QpOwogCQotCW1tY19mcmVlX2hvc3QobW1jKTsKKwkvKgorCSAqIFNldCB1cCBjYXJkIGRldGVjdGlvbi4KKwkgKi8KKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUElOUywgV0JTRF9QSU5TX0RFVEVDVF9HUDExKTsKKwkKKwkvKgorCSAqIENvbmZpZ3VyZSBjaGlwCisJICovCisJd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX1BPUlRfSEksIGhvc3QtPmJhc2UgPj4gOCk7CisJd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX1BPUlRfTE8sIGhvc3QtPmJhc2UgJiAweGZmKTsKKwkKKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfSVJRLCBob3N0LT5pcnEpOworCQorCWlmIChob3N0LT5kbWEgPj0gMCkKKwkJd2JzZF93cml0ZV9jb25maWcoaG9zdCwgV0JTRF9DT05GX0RSUSwgaG9zdC0+ZG1hKTsKKwkKKwkvKgorCSAqIEVuYWJsZSBhbmQgcG93ZXIgdXAgY2hpcC4KKwkgKi8KKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfRU5BQkxFLCAxKTsKKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE9XRVIsIDB4MjApOworfQorCisvKgorICogQ2hlY2sgdGhhdCBjb25maWd1cmVkIHJlc291cmNlcyBhcmUgY29ycmVjdC4KKyAqLworIAorc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9jaGlwX3ZhbGlkYXRlKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCit7CisJaW50IGJhc2UsIGlycSwgZG1hOworCQorCS8qCisJICogU2VsZWN0IFNEL01NQyBmdW5jdGlvbi4KKwkgKi8KKwl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfREVWSUNFLCBERVZJQ0VfU0QpOworCQorCS8qCisJICogUmVhZCBjb25maWd1cmF0aW9uLgorCSAqLworCWJhc2UgPSB3YnNkX3JlYWRfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9QT1JUX0hJKSA8PCA4OworCWJhc2UgfD0gd2JzZF9yZWFkX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE9SVF9MTyk7CisJCisJaXJxID0gd2JzZF9yZWFkX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfSVJRKTsKKwkKKwlkbWEgPSB3YnNkX3JlYWRfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9EUlEpOworCQorCS8qCisJICogVmFsaWRhdGUgYWdhaW5zdCBnaXZlbiBjb25maWd1cmF0aW9uLgorCSAqLworCWlmIChiYXNlICE9IGhvc3QtPmJhc2UpCisJCXJldHVybiAwOworCWlmIChpcnEgIT0gaG9zdC0+aXJxKQorCQlyZXR1cm4gMDsKKwlpZiAoKGRtYSAhPSBob3N0LT5kbWEpICYmIChob3N0LT5kbWEgIT0gLTEpKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXZpY2VzIHNldHVwIGFuZCBzaHV0ZG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX2luaXQoc3RydWN0IGRldmljZSogZGV2LCBpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSwKKwlpbnQgcG5wKQoreworCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSBOVUxMOworCXN0cnVjdCBtbWNfaG9zdCogbW1jID0gTlVMTDsKKwlpbnQgcmV0OworCQorCXJldCA9IHdic2RfYWxsb2NfbW1jKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkKKwltbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwkKKwkvKgorCSAqIFNjYW4gZm9yIGhhcmR3YXJlLgorCSAqLworCXJldCA9IHdic2Rfc2Nhbihob3N0KTsKKwlpZiAocmV0KQorCXsKKwkJaWYgKHBucCAmJiAocmV0ID09IC1FTk9ERVYpKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FCisJCQkJIjogVW5hYmxlIHRvIGNvbmZpcm0gZGV2aWNlIHByZXNlbmNlLiBZb3UgbWF5ICIKKwkJCQkiZXhwZXJpZW5jZSBsb2NrLXVwcy5cbiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJd2JzZF9mcmVlX21tYyhkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwkKKwkvKgorCSAqIFJlcXVlc3QgcmVzb3VyY2VzLgorCSAqLworCXJldCA9IHdic2RfcmVxdWVzdF9yZXNvdXJjZXMoaG9zdCwgaW8sIGlycSwgZG1hKTsKKwlpZiAocmV0KQorCXsKKwkJd2JzZF9yZWxlYXNlX3Jlc291cmNlcyhob3N0KTsKKwkJd2JzZF9mcmVlX21tYyhkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwkvKgorCSAqIFNlZSBpZiBjaGlwIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQuCisJICovCisJaWYgKHBucCAmJiAoaG9zdC0+Y29uZmlnICE9IDApKQorCXsKKwkJaWYgKCF3YnNkX2NoaXBfdmFsaWRhdGUoaG9zdCkpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUKKwkJCQkiOiBQblAgYWN0aXZlIGJ1dCBjaGlwIG5vdCBjb25maWd1cmVkISAiCisJCQkJIllvdSBwcm9iYWJseSBoYXZlIGEgYnVnZ3kgQklPUy4gIgorCQkJCSJDb25maWd1cmluZyBjaGlwIG1hbnVhbGx5LlxuIik7CisJCQl3YnNkX2NoaXBfY29uZmlnKGhvc3QpOworCQl9CisJfQorCWVsc2UKKwkJd2JzZF9jaGlwX2NvbmZpZyhob3N0KTsKKwkKKwkvKgorCSAqIFBvd2VyIE1hbmFnZW1lbnQgc3R1ZmYuIE5vIGlkZWEgaG93IHRoaXMgd29ya3MuCisJICogTm90IHRlc3RlZC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoaG9zdC0+Y29uZmlnKQorCQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE1FLCAweEEwKTsKKyNlbmRpZgorCS8qCisJICogQWxsb3cgZGV2aWNlIHRvIGluaXRpYWxpc2UgaXRzZWxmIHByb3Blcmx5LgorCSAqLworCW1kZWxheSg1KTsKKworCS8qCisJICogUmVzZXQgdGhlIGNoaXAgaW50byBhIGtub3duIHN0YXRlLgorCSAqLworCXdic2RfaW5pdF9kZXZpY2UoaG9zdCk7CisJCisJbW1jX2FkZF9ob3N0KG1tYyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVzgzTDUxeEQiLCBtbWMtPmhvc3RfbmFtZSk7CisJaWYgKGhvc3QtPmNoaXBfaWQgIT0gMCkKKwkJcHJpbnRrKCIgaWQgJXgiLCAoaW50KWhvc3QtPmNoaXBfaWQpOworCXByaW50aygiIGF0IDB4JXggaXJxICVkIiwgKGludClob3N0LT5iYXNlLCAoaW50KWhvc3QtPmlycSk7CisJaWYgKGhvc3QtPmRtYSA+PSAwKQorCQlwcmludGsoIiBkbWEgJWQiLCAoaW50KWhvc3QtPmRtYSk7CisJZWxzZQorCQlwcmludGsoIiBGSUZPIik7CisJaWYgKHBucCkKKwkJcHJpbnRrKCIgUG5QIik7CisJcHJpbnRrKCJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3YnNkX3NodXRkb3duKHN0cnVjdCBkZXZpY2UqIGRldiwgaW50IHBucCkKK3sKKwlzdHJ1Y3QgbW1jX2hvc3QqIG1tYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3Q7CisJCisJaWYgKCFtbWMpCisJCXJldHVybjsKKworCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCQorCW1tY19yZW1vdmVfaG9zdChtbWMpOworCisJaWYgKCFwbnApCisJeworCQkvKgorCQkgKiBQb3dlciBkb3duIHRoZSBTRC9NTUMgZnVuY3Rpb24uCisJCSAqLworCQl3YnNkX3VubG9ja19jb25maWcoaG9zdCk7CisJCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9ERVZJQ0UsIERFVklDRV9TRCk7CisJCXdic2Rfd3JpdGVfY29uZmlnKGhvc3QsIFdCU0RfQ09ORl9FTkFCTEUsIDApOworCQl3YnNkX2xvY2tfY29uZmlnKGhvc3QpOworCX0KKwkKKwl3YnNkX3JlbGVhc2VfcmVzb3VyY2VzKGhvc3QpOworCQorCXdic2RfZnJlZV9tbWMoZGV2KTsKK30KKworLyoKKyAqIE5vbi1QblAKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX3Byb2JlKHN0cnVjdCBkZXZpY2UqIGRldikKK3sKKwlyZXR1cm4gd2JzZF9pbml0KGRldiwgaW8sIGlycSwgZG1hLCAwKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd2JzZF9yZW1vdmUoc3RydWN0IGRldmljZSogZGV2KQoreworCXdic2Rfc2h1dGRvd24oZGV2LCAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUG5QCisgKi8KKworI2lmZGVmIENPTkZJR19QTlAKKworc3RhdGljIGludCBfX2RldmluaXQKK3dic2RfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICogcG5wZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQoreworCWludCBpbywgaXJxLCBkbWE7CisJCisJLyoKKwkgKiBHZXQgcmVzb3VyY2VzIGZyb20gUG5QIGxheWVyLgorCSAqLworCWlvID0gcG5wX3BvcnRfc3RhcnQocG5wZGV2LCAwKTsKKwlpcnEgPSBwbnBfaXJxKHBucGRldiwgMCk7CisJaWYgKHBucF9kbWFfdmFsaWQocG5wZGV2LCAwKSkKKwkJZG1hID0gcG5wX2RtYShwbnBkZXYsIDApOworCWVsc2UKKwkJZG1hID0gLTE7CisJCisJREJHRigiUG5QIHJlc291cmNlczogcG9ydCAlM3ggaXJxICVkIGRtYSAlZFxuIiwgaW8sIGlycSwgZG1hKTsKKwkKKwlyZXR1cm4gd2JzZF9pbml0KCZwbnBkZXYtPmRldiwgaW8sIGlycSwgZG1hLCAxKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqIGRldikKK3sKKwl3YnNkX3NodXRkb3duKCZkZXYtPmRldiwgMSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCisKIC8qCiAgKiBQb3dlciBtYW5hZ2VtZW50CiAgKi8KQEAgLTE1ODEsMTcgKzE4OTUsNyBAQAogI2RlZmluZSB3YnNkX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgd2JzZF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugd2JzZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gRFJJVkVSX05BTUUsCi0JLmlkCQkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnJlbGVhc2UgPSB3YnNkX3JlbGVhc2UsCi0JfSwKLX07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqd2JzZF9kZXZpY2U7CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB3YnNkX2RyaXZlciA9IHsKIAkubmFtZQkJPSBEUklWRVJfTkFNRSwKQEAgLTE2MDMsNiArMTkwNywxNyBAQAogCS5yZXN1bWUJCT0gd2JzZF9yZXN1bWUsCiB9OwogCisjaWZkZWYgQ09ORklHX1BOUAorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JzZF9wbnBfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IHBucF9kZXZfdGFibGUsCisJLnByb2JlCQk9IHdic2RfcG5wX3Byb2JlLAorCS5yZW1vdmUJCT0gd2JzZF9wbnBfcmVtb3ZlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKwogLyoKICAqIE1vZHVsZSBsb2FkaW5nL3VubG9hZGluZwogICovCkBAIC0xNjE1LDI5ICsxOTMwLDU3IEBACiAJCSI6IFdpbmJvbmQgVzgzTDUxeEQgU0QvTU1DIGNhcmQgaW50ZXJmYWNlIGRyaXZlciwgIgogCQlEUklWRVJfVkVSU0lPTiAiXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IENvcHlyaWdodChjKSBQaWVycmUgT3NzbWFuXG4iKTsKLQkKLQlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKIAotCXJlc3VsdCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd2JzZF9kZXZpY2UpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OworI2lmZGVmIENPTkZJR19QTlAKKworCWlmICghbm9wbnApCisJeworCQlyZXN1bHQgPSBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZ3YnNkX3BucF9kcml2ZXIpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisjZW5kaWYgLyogQ09ORklHX1BOUCAqLwkKKwkKKwlpZiAobm9wbnApCisJeworCQlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyZXR1cm4gcmVzdWx0OworCisJCXdic2RfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUklWRVJfTkFNRSwgLTEsCisJCQlOVUxMLCAwKTsKKwkJaWYgKElTX0VSUih3YnNkX2RldmljZSkpCisJCQlyZXR1cm4gUFRSX0VSUih3YnNkX2RldmljZSk7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3YnNkX2Rydl9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJndic2RfZGV2aWNlKTsKKyNpZmRlZiBDT05GSUdfUE5QCisKKwlpZiAoIW5vcG5wKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJndic2RfcG5wX2RyaXZlcik7CiAJCi0JZHJpdmVyX3VucmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCQorCisJaWYgKG5vcG5wKQorCXsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2JzZF9kZXZpY2UpOworCQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmd2JzZF9kcml2ZXIpOworCX0KIAogCURCRygidW5sb2FkZWRcbiIpOwogfQogCiBtb2R1bGVfaW5pdCh3YnNkX2Rydl9pbml0KTsKIG1vZHVsZV9leGl0KHdic2RfZHJ2X2V4aXQpOworI2lmZGVmIENPTkZJR19QTlAKK21vZHVsZV9wYXJhbShub3BucCwgdWludCwgMDQ0NCk7CisjZW5kaWYKIG1vZHVsZV9wYXJhbShpbywgdWludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0oaXJxLCB1aW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbShkbWEsIGludCwgMDQ0NCk7CkBAIC0xNjQ2LDYgKzE5ODksOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJXaW5ib25kIFc4M0w1MXhEIFNEL01NQyBjYXJkIGludGVyZmFjZSBkcml2ZXIiKTsKIE1PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIAorI2lmZGVmIENPTkZJR19QTlAKK01PRFVMRV9QQVJNX0RFU0Mobm9wbnAsICJTY2FuIGZvciBkZXZpY2UgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFBOUC4gKGRlZmF1bHQgMCkiKTsKKyNlbmRpZgogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIHRvIGFsbG9jYXRlLiBNdXN0IGJlIDggYnl0ZSBhbGlnbmVkLiAoZGVmYXVsdCAweDI0OCkiKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIHRvIGFsbG9jYXRlLiAoZGVmYXVsdCA2KSIpOwogTU9EVUxFX1BBUk1fREVTQyhkbWEsICJETUEgY2hhbm5lbCB0byBhbGxvY2F0ZS4gLTEgZm9yIG5vIERNQS4gKGRlZmF1bHQgMikiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3dic2QuaCBiL2RyaXZlcnMvbW1jL3dic2QuaAppbmRleCBmZGMwM2I1Li44NjRmMzA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5oCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuaApAQCAtMzUsNiArMzUsMTIgQEAKIAogI2RlZmluZSBERVZJQ0VfU0QJCTB4MDMKIAorI2RlZmluZSBXQlNEX1BJTlNfREFUM19ISQkweDIwCisjZGVmaW5lIFdCU0RfUElOU19EQVQzX09VVAkweDEwCisjZGVmaW5lIFdCU0RfUElOU19HUDExX0hJCTB4MDQKKyNkZWZpbmUgV0JTRF9QSU5TX0RFVEVDVF9HUDExCTB4MDIKKyNkZWZpbmUgV0JTRF9QSU5TX0RFVEVDVF9EQVQzCTB4MDEKKwogI2RlZmluZSBXQlNEX0NNRFIJCTB4MDAKICNkZWZpbmUgV0JTRF9ERlIJCTB4MDEKICNkZWZpbmUgV0JTRF9FSVIJCTB4MDIKQEAgLTEzMyw2ICsxMzksNyBAQAogI2RlZmluZSBXQlNEX0NSQ19PSwkJMHgwNSAvKiBTMDEwRSAoMDAxMDEpICovCiAjZGVmaW5lIFdCU0RfQ1JDX0ZBSUwJCTB4MEIgLyogUzEwMUUgKDAxMDExKSAqLwogCisjZGVmaW5lIFdCU0RfRE1BX1NJWkUJCTY1NTM2CiAKIHN0cnVjdCB3YnNkX2hvc3QKIHsKQEAgLTE0MCw2ICsxNDcsMTEgQEAKIAkKIAlzcGlubG9ja190CQlsb2NrOwkJLyogTXV0ZXggKi8KIAorCWludAkJCWZsYWdzOwkJLyogRHJpdmVyIHN0YXRlcyAqLworCisjZGVmaW5lIFdCU0RfRkNBUkRfUFJFU0VOVAkoMTw8MCkJCS8qIENhcmQgaXMgcHJlc2VudCAqLworI2RlZmluZSBXQlNEX0ZJR05PUkVfREVURUNUCSgxPDwxKQkJLyogSWdub3JlIGNhcmQgZGV0ZWN0aW9uICovCisJCiAJc3RydWN0IG1tY19yZXF1ZXN0KgltcnE7CQkvKiBDdXJyZW50IHJlcXVlc3QgKi8KIAkKIAl1OAkJCWlzcjsJCS8qIEFjY3VtdWxhdGVkIElTUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCA2MjAyYjEwLi5lMDM4ZDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMTg3LDcgKzE4Nyw3IEBACiBvYmotJChDT05GSUdfV0FOKSArPSB3YW4vCiBvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQvCiBvYmotJChDT05GSUdfTkVUX1BDTUNJQSkgKz0gcGNtY2lhLwotb2JqLSQoQ09ORklHX05FVF9XSVJFTEVTUykgKz0gd2lyZWxlc3MvCitvYmotJChDT05GSUdfTkVUX1JBRElPKSArPSB3aXJlbGVzcy8KIG9iai0kKENPTkZJR19ORVRfVFVMSVApICs9IHR1bGlwLwogb2JqLSQoQ09ORklHX0hBTVJBRElPKSArPSBoYW1yYWRpby8KIG9iai0kKENPTkZJR19JUkRBKSArPSBpcmRhLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKaW5kZXggZjJlOTM3YS4uYjdkZDcyNiAxMDA3NTUKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC03MzgsNiArNzM4LDcgQEAKIAlzaG9ydCB2dGFnOwogI2VuZGlmCiAJaW50IHJ4X3BrdF9saW1pdCA9IGRldi0+cXVvdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKIAlkb3sgICAKIAkJLyogcHJvY2VzcyByZWNlaXZlIHBhY2tldHMgdW50aWwgd2UgdXNlIHRoZSBxdW90YSovCkBAIC04NDEsMTggKzg0MiwxOSBAQAogCS8qIFJlY2VpdmUgZGVzY3JpcHRvciBpcyBlbXB0eSBub3cgKi8KIAlkZXYtPnF1b3RhIC09IG51bV9yeF9wa3Q7CiAJKmJ1ZGdldCAtPSBudW1fcnhfcGt0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CiAJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKLQkvKiBlbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KIAl3cml0ZWwoVkFMMHxSSU5URU4wLCBtbWlvICsgSU5URU4wKTsKIAl3cml0ZWwoVkFMMiB8IFJETUQwLCBtbWlvICsgQ01EMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKKwogcnhfbm90X2VtcHR5OgogCS8qIERvIG5vdCBjYWxsIGEgbmV0aWZfcnhfY29tcGxldGUgKi8KIAlkZXYtPnF1b3RhIC09IG51bV9yeF9wa3Q7CQogCSpidWRnZXQgLT0gbnVtX3J4X3BrdDsKIAlyZXR1cm4gMTsKLQotCQogfQogCiAjZWxzZQpAQCAtMTI2MSwxOCArMTI2MywyMCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKIAlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOwotCXVuc2lnbmVkIGludCBpbnRyMDsKKwl1bnNpZ25lZCBpbnQgaW50cjAsIGludHJlbjA7CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOwogCi0JaWYoZGV2ID09IE5VTEwpCisJaWYodW5saWtlbHkoZGV2ID09IE5VTEwpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpZiAocmVncykgc3Bpbl9sb2NrICgmbHAtPmxvY2spOworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCiAJLyogZGlzYWJsaW5nIGludGVycnVwdCAqLwogCXdyaXRlbChJTlRSRU4sIG1taW8gKyBDTUQwKTsKIAogCS8qIFJlYWQgaW50ZXJydXB0IHN0YXR1cyAqLwogCWludHIwID0gcmVhZGwobW1pbyArIElOVDApOworCWludHJlbjAgPSByZWFkbChtbWlvICsgSU5URU4wKTsKIAogCS8qIFByb2Nlc3MgYWxsIHRoZSBJTlQgZXZlbnQgdW50aWwgSU5UUiBiaXQgaXMgY2xlYXIuICovCiAKQEAgLTEyOTMsMTEgKzEyOTcsMTEgQEAKIAkJCS8qIFNjaGVkdWxlIGEgcG9sbGluZyByb3V0aW5lICovCiAJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCX0KLQkJZWxzZSB7CisJCWVsc2UgaWYgKGludHJlbjAgJiBSSU5URU4wKSB7CiAJCQlwcmludGsoIioqKioqKioqKioqKkRyaXZlciBidWchIFwKIAkJCQlpbnRlcnJ1cHQgd2hpbGUgaW4gcG9sbFxuIik7Ci0JCQkvKiBGaXggYnkgZGlzYWJsaW5nIGludGVycnVwdHMgKi8KLQkJCXdyaXRlbChSSU5UMCwgbW1pbyArIElOVDApOworCQkJLyogRml4IGJ5IGRpc2FibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJCQl3cml0ZWwoUklOVEVOMCwgbW1pbyArIElOVEVOMCk7CiAJCX0KIAl9CiAjZWxzZQpAQCAtMTMyMSw3ICsxMzI1LDcgQEAKIGVycl9ub19pbnRlcnJ1cHQ6CiAJd3JpdGVsKCBWQUwwIHwgSU5UUkVOLG1taW8gKyBDTUQwKTsKIAkKLQlpZiAocmVncykgc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOwogCQogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDFiNjhkZDUuLjRhNDdkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTE1NSw5ICsxNTUsOSBAQAogCiAjZGVmaW5lIERSVl9OQU1FCQkiZTEwMCIKICNkZWZpbmUgRFJWX0VYVAkJIi1OQVBJIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjMuMy42LWsyIkRSVl9FWFQKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIzLjQuOC1rMiJEUlZfRVhUCiAjZGVmaW5lIERSVl9ERVNDUklQVElPTgkJIkludGVsKFIpIFBSTy8xMDAgTmV0d29yayBEcml2ZXIiCi0jZGVmaW5lIERSVl9DT1BZUklHSFQJCSJDb3B5cmlnaHQoYykgMTk5OS0yMDA0IEludGVsIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCQkiQ29weXJpZ2h0KGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbiIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgogCiAjZGVmaW5lIEUxMDBfV0FUQ0hET0dfUEVSSU9ECSgyICogSFopCkBAIC0yMTAsMTEgKzIxMCwxNyBAQAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjksIDYpLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNkEsIDYpLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNkIsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwOTEsIDcpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwOTIsIDcpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwOTMsIDcpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwOTQsIDcpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwOTUsIDcpLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEyMDksIDApLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEyMjksIDApLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NDksIDIpLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NTksIDIpLAogCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NUQsIDIpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI3REMsIDcpLAogCXsgMCwgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlMTAwX2lkX3RhYmxlKTsKQEAgLTI2OSw2ICsyNzUsMTIgQEAKIAlydXNfbWFzayAgICAgICAgID0gMHgzQywKIH07CiAKK2VudW0gcnVfc3RhdGUgIHsKKwlSVV9TVVNQRU5ERUQgPSAwLAorCVJVX1JVTk5JTkcJID0gMSwKKwlSVV9VTklOSVRJQUxJWkVEID0gLTEsCit9OworCiBlbnVtIHNjYl9zdGF0X2FjayB7CiAJc3RhdF9hY2tfbm90X291cnMgICAgPSAweDAwLAogCXN0YXRfYWNrX3N3X2dlbiAgICAgID0gMHgwNCwKQEAgLTUxMCw3ICs1MjIsNyBAQAogCXN0cnVjdCByeCAqcnhfdG9fdXNlOwogCXN0cnVjdCByeCAqcnhfdG9fY2xlYW47CiAJc3RydWN0IHJmZCBibGFua19yZmQ7Ci0JaW50IHJ1X3J1bm5pbmc7CisJZW51bSBydV9zdGF0ZSBydV9ydW5uaW5nOwogCiAJc3BpbmxvY2tfdCBjYl9sb2NrCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCXNwaW5sb2NrX3QgY21kX2xvY2s7CkBAIC01MzksNiArNTUxLDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBibGlua190aW1lcjsKIAlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CiAJZW51bSBsb29wYmFjayBsb29wYmFjazsKIAogCXN0cnVjdCBtZW0gKm1lbTsKQEAgLTc3MCw3ICs3ODMsNyBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEUxMDBfV0FJVF9TQ0JfVElNRU9VVCA0MAorI2RlZmluZSBFMTAwX1dBSVRfU0NCX1RJTUVPVVQgMjAwMDAgLyogd2UgbWlnaHQgaGF2ZSB0byB3YWl0IDEwMG1zISEhICovCiBzdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04NDAsNiArODUzLDEwIEBACiAJCQkgKiBiZWNhdXNlIHRoZSBjb250cm9sbGVyIGlzIHRvbyBidXN5LCBzbwogCQkJICogbGV0J3MganVzdCBxdWV1ZSB0aGUgY29tbWFuZCBhbmQgdHJ5IGFnYWluCiAJCQkgKiB3aGVuIGFub3RoZXIgY29tbWFuZCBpcyBzY2hlZHVsZWQuICovCisJCQlpZihlcnIgPT0gLUVOT1NQQykgeworCQkJCS8vcmVxdWVzdCBhIHJlc2V0CisJCQkJc2NoZWR1bGVfd29yaygmbmljLT50eF90aW1lb3V0X3Rhc2spOworCQkJfQogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQluaWMtPmN1Y19jbWQgPSBjdWNfcmVzdW1lOwpAQCAtODg0LDcgKzkwMSw3IEBACiAKIHN0YXRpYyB2b2lkIGUxMDBfZ2V0X2RlZmF1bHRzKHN0cnVjdCBuaWMgKm5pYykKIHsKLQlzdHJ1Y3QgcGFyYW1fcmFuZ2UgcmZkcyA9IHsgLm1pbiA9IDY0LCAubWF4ID0gMjU2LCAuY291bnQgPSA2NCB9OworCXN0cnVjdCBwYXJhbV9yYW5nZSByZmRzID0geyAubWluID0gMTYsIC5tYXggPSAyNTYsIC5jb3VudCA9IDY0IH07CiAJc3RydWN0IHBhcmFtX3JhbmdlIGNicyAgPSB7IC5taW4gPSA2NCwgLm1heCA9IDI1NiwgLmNvdW50ID0gNjQgfTsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5pYy0+cGRldiwgUENJX1JFVklTSU9OX0lELCAmbmljLT5yZXZfaWQpOwpAQCAtODk5LDggKzkxNiw5IEBACiAJLyogUXVhZHdvcmRzIHRvIERNQSBpbnRvIEZJRk8gYmVmb3JlIHN0YXJ0aW5nIGZyYW1lIHRyYW5zbWl0ICovCiAJbmljLT50eF90aHJlc2hvbGQgPSAweEUwOwogCi0JbmljLT50eF9jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdHggfCBjYl9pIHwgY2JfdHhfc2YgfAotCQkoKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSA/IGNiX2NpZCA6IDApKTsKKwkvKiBubyBpbnRlcnJ1cHQgZm9yIGV2ZXJ5IHR4IGNvbXBsZXRpb24sIGRlbGF5ID0gMjU2dXMgaWYgbm90IDU1NyovCisJbmljLT50eF9jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdHggfCBjYl90eF9zZiB8CisJCSgobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpID8gY2JfY2lkIDogY2JfaSkpOwogCiAJLyogVGVtcGxhdGUgZm9yIGEgZnJlc2hseSBhbGxvY2F0ZWQgUkZEICovCiAJbmljLT5ibGFua19yZmQuY29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2VsKTsKQEAgLTk2NCw3ICs5ODIsOCBAQAogCWlmKG5pYy0+ZmxhZ3MgJiBtdWx0aWNhc3RfYWxsKQogCQljb25maWctPm11bHRpY2FzdF9hbGwgPSAweDE7CQkvKiAxPWFjY2VwdCwgMD1ubyAqLwogCi0JaWYoIShuaWMtPmZsYWdzICYgd29sX21hZ2ljKSkKKwkvKiBkaXNhYmxlIFdvTCB3aGVuIHVwICovCisJaWYobmV0aWZfcnVubmluZyhuaWMtPm5ldGRldikgfHwgIShuaWMtPmZsYWdzICYgd29sX21hZ2ljKSkKIAkJY29uZmlnLT5tYWdpY19wYWNrZXRfZGlzYWJsZSA9IDB4MTsJLyogMT1vZmYsIDA9b24gKi8KIAogCWlmKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CkBAIC0xMjAzLDcgKzEyMjIsOSBAQAogCQl9CiAJfQogCi0JZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKTsKKwkKKwlpZihlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2R1bXBfcmVzZXQsIDApKQorCQlEUFJJTlRLKFRYX0VSUiwgREVCVUcsICJleGVjIGN1Y19kdW1wX3Jlc2V0IGZhaWxlZFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGUxMDBfYWRqdXN0X2FkYXB0aXZlX2lmcyhzdHJ1Y3QgbmljICpuaWMsIGludCBzcGVlZCwgaW50IGR1cGxleCkKQEAgLTEyNzksMTIgKzEzMDAsMTUgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWNiLT5jb21tYW5kID0gbmljLT50eF9jb21tYW5kOworCS8qIGludGVycnVwdCBldmVyeSAxNiBwYWNrZXRzIHJlZ2FyZGxlc3Mgb2YgZGVsYXkgKi8KKwlpZigobmljLT5jYnNfYXZhaWwgJiB+MTUpID09IG5pYy0+Y2JzX2F2YWlsKSBjYi0+Y29tbWFuZCB8PSBjYl9pOwogCWNiLT51LnRjYi50YmRfYXJyYXkgPSBjYi0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgY2IsIHUudGNiLnRiZCk7CiAJY2ItPnUudGNiLnRjYl9ieXRlX2NvdW50ID0gMDsKIAljYi0+dS50Y2IudGhyZXNob2xkID0gbmljLT50eF90aHJlc2hvbGQ7CiAJY2ItPnUudGNiLnRiZF9jb3VudCA9IDE7CiAJY2ItPnUudGNiLnRiZC5idWZfYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwKIAkJc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworCS8vIGNoZWNrIGZvciBtYXBwaW5nIGZhaWx1cmU/CiAJY2ItPnUudGNiLnRiZC5zaXplID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOwogfQogCkBAIC0xMjk3LDcgKzEzMjEsOCBAQAogCQkvKiBTVyB3b3JrYXJvdW5kIGZvciBJQ0hbeF0gMTBNYnBzL2hhbGYgZHVwbGV4IFR4IGhhbmcuCiAJCSAgIElzc3VlIGEgTk9QIGNvbW1hbmQgZm9sbG93ZWQgYnkgYSAxdXMgZGVsYXkgYmVmb3JlCiAJCSAgIGlzc3VpbmcgdGhlIFR4IGNvbW1hbmQuICovCi0JCWUxMDBfZXhlY19jbWQobmljLCBjdWNfbm9wLCAwKTsKKwkJaWYoZTEwMF9leGVjX2NtZChuaWMsIGN1Y19ub3AsIDApKQorCQkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiZXhlYyBjdWNfbm9wIGZhaWxlZFxuIik7CiAJCXVkZWxheSgxKTsKIAl9CiAKQEAgLTE0MTUsMTIgKzE0NDAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGUxMDBfc3RhcnRfcmVjZWl2ZXIoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIGlubGluZSB2b2lkIGUxMDBfc3RhcnRfcmVjZWl2ZXIoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4KQogeworCWlmKCFuaWMtPnJ4cykgcmV0dXJuOworCWlmKFJVX1NVU1BFTkRFRCAhPSBuaWMtPnJ1X3J1bm5pbmcpIHJldHVybjsKKworCS8qIGhhbmRsZSBpbml0IHRpbWUgc3RhcnRzICovCisJaWYoIXJ4KSByeCA9IG5pYy0+cnhzOworCiAJLyogKFJlKXN0YXJ0IFJVIGlmIHN1c3BlbmRlZCBvciBpZGxlIGFuZCBSRkEgaXMgbm9uLU5VTEwgKi8KLQlpZighbmljLT5ydV9ydW5uaW5nICYmIG5pYy0+cnhfdG9fY2xlYW4tPnNrYikgewotCQllMTAwX2V4ZWNfY21kKG5pYywgcnVjX3N0YXJ0LCBuaWMtPnJ4X3RvX2NsZWFuLT5kbWFfYWRkcik7Ci0JCW5pYy0+cnVfcnVubmluZyA9IDE7CisJaWYocngtPnNrYikgeworCQllMTAwX2V4ZWNfY21kKG5pYywgcnVjX3N0YXJ0LCByeC0+ZG1hX2FkZHIpOworCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9SVU5OSU5HOwogCX0KIH0KIApAQCAtMTQzNyw2ICsxNDY4LDEzIEBACiAJcngtPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+c2tiLT5kYXRhLAogCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAorCWlmKHBjaV9kbWFfbWFwcGluZ19lcnJvcihyeC0+ZG1hX2FkZHIpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHJ4LT5za2IpOworCQlyeC0+c2tiID0gMDsKKwkJcngtPmRtYV9hZGRyID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJLyogTGluayB0aGUgUkZEIHRvIGVuZCBvZiBSRkEgYnkgbGlua2luZyBwcmV2aW91cyBSRkQgdG8KIAkgKiB0aGlzIG9uZSwgYW5kIGNsZWFyaW5nIEVMIGJpdCBvZiBwcmV2aW91cy4gICovCiAJaWYocngtPnByZXYtPnNrYikgewpAQCAtMTQ3MSw3ICsxNTA5LDcgQEAKIAogCS8qIElmIGRhdGEgaXNuJ3QgcmVhZHksIG5vdGhpbmcgdG8gaW5kaWNhdGUgKi8KIAlpZih1bmxpa2VseSghKHJmZF9zdGF0dXMgJiBjYl9jb21wbGV0ZSkpKQotCQlyZXR1cm4gLUVBR0FJTjsKKwkJcmV0dXJuIC1FTk9EQVRBOwogCiAJLyogR2V0IGFjdHVhbCBkYXRhIHNpemUgKi8KIAlhY3R1YWxfc2l6ZSA9IGxlMTZfdG9fY3B1KHJmZC0+YWN0dWFsX3NpemUpICYgMHgzRkZGOwpAQCAtMTQ4Miw2ICsxNTIwLDEwIEBACiAJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIHJ4LT5kbWFfYWRkciwKIAkJUkZEX0JVRl9MRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKKwkvKiB0aGlzIGFsbG93cyBmb3IgYSBmYXN0IHJlc3RhcnQgd2l0aG91dCByZS1lbmFibGluZyBpbnRlcnJ1cHRzICovCisJaWYobGUxNl90b19jcHUocmZkLT5jb21tYW5kKSAmIGNiX2VsKQorCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9TVVNQRU5ERUQ7CisKIAkvKiBQdWxsIG9mZiB0aGUgUkZEIGFuZCBwdXQgdGhlIGFjdHVhbCBkYXRhIChtaW51cyBldGggaGRyKSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCByZmQpKTsKIAlza2JfcHV0KHNrYiwgYWN0dWFsX3NpemUpOwpAQCAtMTUxNCwyMCArMTU1Niw0NSBAQAogCXVuc2lnbmVkIGludCB3b3JrX3RvX2RvKQogewogCXN0cnVjdCByeCAqcng7CisJaW50IHJlc3RhcnRfcmVxdWlyZWQgPSAwOworCXN0cnVjdCByeCAqcnhfdG9fc3RhcnQgPSBOVUxMOworCisJLyogYXJlIHdlIGFscmVhZHkgcm5yPyB0aGVuIHBheSBhdHRlbnRpb24hISEgdGhpcyBlbnN1cmVzIHRoYXQKKwkgKiB0aGUgc3RhdGUgbWFjaGluZSBwcm9ncmVzc2lvbiBuZXZlciBhbGxvd3MgYSBzdGFydCB3aXRoIGEgCisJICogcGFydGlhbGx5IGNsZWFuZWQgbGlzdCwgYXZvaWRpbmcgYSByYWNlIGJldHdlZW4gaGFyZHdhcmUKKwkgKiBhbmQgcnhfdG9fY2xlYW4gd2hlbiBpbiBOQVBJIG1vZGUgKi8KKwlpZihSVV9TVVNQRU5ERUQgPT0gbmljLT5ydV9ydW5uaW5nKQorCQlyZXN0YXJ0X3JlcXVpcmVkID0gMTsKIAogCS8qIEluZGljYXRlIG5ld2x5IGFycml2ZWQgcGFja2V0cyAqLwogCWZvcihyeCA9IG5pYy0+cnhfdG9fY2xlYW47IHJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b19jbGVhbiA9IHJ4LT5uZXh0KSB7Ci0JCWlmKGUxMDBfcnhfaW5kaWNhdGUobmljLCByeCwgd29ya19kb25lLCB3b3JrX3RvX2RvKSkKKwkJaW50IGVyciA9IGUxMDBfcnhfaW5kaWNhdGUobmljLCByeCwgd29ya19kb25lLCB3b3JrX3RvX2RvKTsKKwkJaWYoLUVBR0FJTiA9PSBlcnIpIHsKKwkJCS8qIGhpdCBxdW90YSBzbyBoYXZlIG1vcmUgd29yayB0byBkbywgcmVzdGFydCBvbmNlCisJCQkgKiBjbGVhbnVwIGlzIGNvbXBsZXRlICovCisJCQlyZXN0YXJ0X3JlcXVpcmVkID0gMDsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYoLUVOT0RBVEEgPT0gZXJyKQogCQkJYnJlYWs7IC8qIE5vIG1vcmUgdG8gY2xlYW4gKi8KIAl9CiAKKwkvKiBzYXZlIG91ciBzdGFydGluZyBwb2ludCBhcyB0aGUgcGxhY2Ugd2UnbGwgcmVzdGFydCB0aGUgcmVjZWl2ZXIgKi8KKwlpZihyZXN0YXJ0X3JlcXVpcmVkKQorCQlyeF90b19zdGFydCA9IG5pYy0+cnhfdG9fY2xlYW47CisKIAkvKiBBbGxvYyBuZXcgc2ticyB0byByZWZpbGwgbGlzdCAqLwogCWZvcihyeCA9IG5pYy0+cnhfdG9fdXNlOyAhcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX3VzZSA9IHJ4LT5uZXh0KSB7CiAJCWlmKHVubGlrZWx5KGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSkKIAkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHRpbWUgKHNlZSB3YXRjaGRvZykgKi8KIAl9CiAKLQllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYyk7CisJaWYocmVzdGFydF9yZXF1aXJlZCkgeworCQkvLyBhY2sgdGhlIHJucj8KKwkJd3JpdGViKHN0YXRfYWNrX3JuciwgJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOworCQllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYywgcnhfdG9fc3RhcnQpOworCQlpZih3b3JrX2RvbmUpCisJCQkoKndvcmtfZG9uZSkrKzsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGUxMDBfcnhfY2xlYW5fbGlzdChzdHJ1Y3QgbmljICpuaWMpCkBAIC0xNTM1LDYgKzE2MDIsOCBAQAogCXN0cnVjdCByeCAqcng7CiAJdW5zaWduZWQgaW50IGksIGNvdW50ID0gbmljLT5wYXJhbXMucmZkcy5jb3VudDsKIAorCW5pYy0+cnVfcnVubmluZyA9IFJVX1VOSU5JVElBTElaRUQ7CisKIAlpZihuaWMtPnJ4cykgewogCQlmb3IocnggPSBuaWMtPnJ4cywgaSA9IDA7IGkgPCBjb3VudDsgcngrKywgaSsrKSB7CiAJCQlpZihyeC0+c2tiKSB7CkBAIC0xNTQ4LDcgKzE2MTcsNiBAQAogCX0KIAogCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7Ci0JbmljLT5ydV9ydW5uaW5nID0gMDsKIH0KIAogc3RhdGljIGludCBlMTAwX3J4X2FsbG9jX2xpc3Qoc3RydWN0IG5pYyAqbmljKQpAQCAtMTU1Nyw2ICsxNjI1LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSBuaWMtPnBhcmFtcy5yZmRzLmNvdW50OwogCiAJbmljLT5yeF90b191c2UgPSBuaWMtPnJ4X3RvX2NsZWFuID0gTlVMTDsKKwluaWMtPnJ1X3J1bm5pbmcgPSBSVV9VTklOSVRJQUxJWkVEOwogCiAJaWYoIShuaWMtPnJ4cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByeCkgKiBjb3VudCwgR0ZQX0FUT01JQykpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1NzIsNiArMTY0MSw3IEBACiAJfQogCiAJbmljLT5yeF90b191c2UgPSBuaWMtPnJ4X3RvX2NsZWFuID0gbmljLT5yeHM7CisJbmljLT5ydV9ydW5uaW5nID0gUlVfU1VTUEVOREVEOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTkzLDcgKzE2NjMsNyBAQAogCiAJLyogV2UgaGl0IFJlY2VpdmUgTm8gUmVzb3VyY2UgKFJOUik7IHJlc3RhcnQgUlUgYWZ0ZXIgY2xlYW5pbmcgKi8KIAlpZihzdGF0X2FjayAmIHN0YXRfYWNrX3JucikKLQkJbmljLT5ydV9ydW5uaW5nID0gMDsKKwkJbmljLT5ydV9ydW5uaW5nID0gUlVfU1VTUEVOREVEOwogCiAJZTEwMF9kaXNhYmxlX2lycShuaWMpOwogCW5ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CkBAIC0xNjYzLDYgKzE3MzMsNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGUxMDBfYXNmKHN0cnVjdCBuaWMgKm5pYykKIHsKIAkvKiBBU0YgY2FuIGJlIGVuYWJsZWQgZnJvbSBlZXByb20gKi8KQEAgLTE2NzEsNiArMTc0Miw3IEBACiAJICAgIShuaWMtPmVlcHJvbVtlZXByb21fY29uZmlnX2FzZl0gJiBlZXByb21fZ2NsKSAmJgogCSAgICgobmljLT5lZXByb21bZWVwcm9tX3NtYnVzX2FkZHJdICYgMHhGRikgIT0gMHhGRSkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgZTEwMF91cChzdHJ1Y3QgbmljICpuaWMpCiB7CkBAIC0xNjgzLDEzICsxNzU1LDE2IEBACiAJaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKIAkJZ290byBlcnJfY2xlYW5fY2JzOwogCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKLQllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYyk7CisJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMsIDApOwogCW1vZF90aW1lcigmbmljLT53YXRjaGRvZywgamlmZmllcyk7CiAJaWYoKGVyciA9IHJlcXVlc3RfaXJxKG5pYy0+cGRldi0+aXJxLCBlMTAwX2ludHIsIFNBX1NISVJRLAogCQluaWMtPm5ldGRldi0+bmFtZSwgbmljLT5uZXRkZXYpKSkKIAkJZ290byBlcnJfbm9faXJxOwotCWUxMDBfZW5hYmxlX2lycShuaWMpOwogCW5ldGlmX3dha2VfcXVldWUobmljLT5uZXRkZXYpOworCW5ldGlmX3BvbGxfZW5hYmxlKG5pYy0+bmV0ZGV2KTsKKwkvKiBlbmFibGUgaW50cyBfYWZ0ZXJfIGVuYWJsaW5nIHBvbGwsIHByZXZlbnRpbmcgYSByYWNlIGJldHdlZW4KKwkgKiBkaXNhYmxlIGludHMrc2NoZWR1bGUgKi8KKwllMTAwX2VuYWJsZV9pcnEobmljKTsKIAlyZXR1cm4gMDsKIAogZXJyX25vX2lycToKQEAgLTE3MDMsMTEgKzE3NzgsMTMgQEAKIAogc3RhdGljIHZvaWQgZTEwMF9kb3duKHN0cnVjdCBuaWMgKm5pYykKIHsKKwkvKiB3YWl0IGhlcmUgZm9yIHBvbGwgdG8gY29tcGxldGUgKi8KKwluZXRpZl9wb2xsX2Rpc2FibGUobmljLT5uZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmljLT5uZXRkZXYpOwogCWUxMDBfaHdfcmVzZXQobmljKTsKIAlmcmVlX2lycShuaWMtPnBkZXYtPmlycSwgbmljLT5uZXRkZXYpOwogCWRlbF90aW1lcl9zeW5jKCZuaWMtPndhdGNoZG9nKTsKIAluZXRpZl9jYXJyaWVyX29mZihuaWMtPm5ldGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShuaWMtPm5ldGRldik7CiAJZTEwMF9jbGVhbl9jYnMobmljKTsKIAllMTAwX3J4X2NsZWFuX2xpc3QobmljKTsKIH0KQEAgLTE3MTYsNiArMTc5MywxNSBAQAogewogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKKwkvKiBSZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0LCB0byBhdm9pZCByZXF1ZXN0X2lycSAKKwkgKiBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJm5pYy0+dHhfdGltZW91dF90YXNrKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCiAJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAic2NiLnN0YXR1cz0weCUwMlhcbiIsCiAJCXJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXR1cykpOwogCWUxMDBfZG93bihuZXRkZXZfcHJpdihuZXRkZXYpKTsKQEAgLTE3NDksNyArMTgzNSw3IEBACiAJCW1kaW9fd3JpdGUobmljLT5uZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCiAJCQlCTUNSX0xPT1BCQUNLKTsKIAotCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljKTsKKwllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYywgMCk7CiAKIAlpZighKHNrYiA9IGRldl9hbGxvY19za2IoRVRIX0RBVEFfTEVOKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTE4NjksNyArMTk1NSw2IEBACiAJZWxzZQogCQluaWMtPmZsYWdzICY9IH53b2xfbWFnaWM7CiAKLQlwY2lfZW5hYmxlX3dha2UobmljLT5wZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKTsKIAllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTIyMjMsNiArMjMwOCw3IEBACiAKIAllMTAwX2dldF9kZWZhdWx0cyhuaWMpOwogCisJLyogbG9ja3MgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBod19yZXNldCAqLwogCXNwaW5fbG9ja19pbml0KCZuaWMtPmNiX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZuaWMtPmNtZF9sb2NrKTsKIApAQCAtMjI0MCw2ICsyMzI2LDkgQEAKIAluaWMtPmJsaW5rX3RpbWVyLmZ1bmN0aW9uID0gZTEwMF9ibGlua19sZWQ7CiAJbmljLT5ibGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbmljOwogCisJSU5JVF9XT1JLKCZuaWMtPnR4X3RpbWVvdXRfdGFzaywKKwkJKHZvaWQgKCopKHZvaWQgKikpZTEwMF90eF90aW1lb3V0X3Rhc2ssIG5ldGRldik7CisKIAlpZigoZXJyID0gZTEwMF9hbGxvYyhuaWMpKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgYWxsb2MgZHJpdmVyIG1lbW9yeSwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CkBAIC0yMjYzLDcgKzIzNTIsOCBAQAogCSAgIChuaWMtPmVlcHJvbVtlZXByb21faWRdICYgZWVwcm9tX2lkX3dvbCkpCiAJCW5pYy0+ZmxhZ3MgfD0gd29sX21hZ2ljOwogCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpOworCS8qIGFjayBhbnkgcGVuZGluZyB3YWtlIGV2ZW50cywgZGlzYWJsZSBQTUUgKi8KKwlwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgMCk7CiAKIAlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAlpZigoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7CkBAIC0yMzM1LDcgKzI0MjUsMTAgQEAKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQllMTAwX2h3X2luaXQobmljKTsKKwkvKiBhY2sgYW55IHBlbmRpbmcgd2FrZSBldmVudHMsIGRpc2FibGUgUE1FICovCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIDApOworCWlmKGUxMDBfaHdfaW5pdChuaWMpKQorCQlEUFJJTlRLKEhXLCBFUlIsICJlMTAwX2h3X2luaXQgZmFpbGVkXG4iKTsKIAogCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIAlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCkBAIC0yMzQ1LDYgKzI0MzgsMjEgQEAKIH0KICNlbmRpZgogCisKK3N0YXRpYyB2b2lkIGUxMDBfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisjaWZkZWYgQ09ORklHX1BNCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpOworI2Vsc2UKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgbmljLT5mbGFncyAmICh3b2xfbWFnaWMpKTsKKyNlbmRpZgorfQorCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlMTAwX2RyaXZlciA9IHsKIAkubmFtZSA9ICAgICAgICAgRFJWX05BTUUsCiAJLmlkX3RhYmxlID0gICAgIGUxMDBfaWRfdGFibGUsCkBAIC0yMzU0LDYgKzI0NjIsMTEgQEAKIAkuc3VzcGVuZCA9ICAgICAgZTEwMF9zdXNwZW5kLAogCS5yZXN1bWUgPSAgICAgICBlMTAwX3Jlc3VtZSwKICNlbmRpZgorCisJLmRyaXZlciA9IHsKKwkJLnNodXRkb3duID0gZTEwMF9zaHV0ZG93biwKKwl9CisKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGUxMDBfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCmluZGV4IDE0ODkzMGQuLmFmMWU4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIApAQCAtMTEyLDYgKzExMiw4IEBACiAjZGVmaW5lIEUxMDAwX01BWF84MjU0NF9SWEQgICAgICAgICAgICAgICA0MDk2CiAKIC8qIFN1cHBvcnRlZCBSeCBCdWZmZXIgU2l6ZXMgKi8KKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfMTI4ICAgMTI4ICAgIC8qIFVzZWQgZm9yIHBhY2tldCBzcGxpdCAqLworI2RlZmluZSBFMTAwMF9SWEJVRkZFUl8yNTYgICAyNTYgICAgLyogVXNlZCBmb3IgcGFja2V0IHNwbGl0ICovCiAjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzIwNDggIDIwNDgKICNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfNDA5NiAgNDA5NgogI2RlZmluZSBFMTAwMF9SWEJVRkZFUl84MTkyICA4MTkyCkBAIC0xMzcsMTUgKzEzOSwxOSBAQAogLyogSG93IG1hbnkgUnggQnVmZmVycyBkbyB3ZSBidW5kbGUgaW50byBvbmUgd3JpdGUgdG8gdGhlIGhhcmR3YXJlID8gKi8KICNkZWZpbmUgRTEwMDBfUlhfQlVGRkVSX1dSSVRFCTE2CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLwogCi0jZGVmaW5lIEFVVE9fQUxMX01PREVTICAgICAgIDAKLSNkZWZpbmUgRTEwMDBfRUVQUk9NXzgyNTQ0X0FQTSAweDAwMDQKLSNkZWZpbmUgRTEwMDBfRUVQUk9NX0FQTUUgICAgMHgwNDAwCisjZGVmaW5lIEFVVE9fQUxMX01PREVTICAgICAgICAgICAgMAorI2RlZmluZSBFMTAwMF9FRVBST01fODI1NDRfQVBNICAgIDB4MDQwMAorI2RlZmluZSBFMTAwMF9FRVBST01fQVBNRSAgICAgICAgIDB4MDQwMAogCiAjaWZuZGVmIEUxMDAwX01BU1RFUl9TTEFWRQogLyogU3dpdGNoIHRvIG92ZXJyaWRlIFBIWSBtYXN0ZXIvc2xhdmUgc2V0dGluZyAqLwogI2RlZmluZSBFMTAwMF9NQVNURVJfU0xBVkUJZTEwMDBfbXNfaHdfZGVmYXVsdAogI2VuZGlmCiAKKyNkZWZpbmUgRTEwMDBfTU5HX1ZMQU5fTk9ORSAtMQorLyogTnVtYmVyIG9mIHBhY2tldCBzcGxpdCBkYXRhIGJ1ZmZlcnMgKG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciBidWZmZXIpICovCisjZGVmaW5lIFBTX1BBR0VfQlVGRkVSUyBNQVhfUFNfQlVGRkVSUy0xCisKIC8qIG9ubHkgd29ya3MgZm9yIHNpemVzIHRoYXQgYXJlIHBvd2VycyBvZiAyICovCiAjZGVmaW5lIEUxMDAwX1JPVU5EVVAoaSwgc2l6ZSkgKChpKSA9ICgoKGkpICsgKHNpemUpIC0gMSkgJiB+KChzaXplKSAtIDEpKSkKIApAQCAtMTU5LDYgKzE2NSw5IEBACiAJdWludDE2X3QgbmV4dF90b193YXRjaDsKIH07CiAKK3N0cnVjdCBlMTAwMF9wc19wYWdlIHsgc3RydWN0IHBhZ2UgKnBzX3BhZ2VbTUFYX1BTX0JVRkZFUlNdOyB9Oworc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hIHsgdWludDY0X3QgcHNfcGFnZV9kbWFbTUFYX1BTX0JVRkZFUlNdOyB9OworCiBzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nIHsKIAkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCiAJdm9pZCAqZGVzYzsKQEAgLTE3NCwxMiArMTgzLDE5IEBACiAJdW5zaWduZWQgaW50IG5leHRfdG9fY2xlYW47CiAJLyogYXJyYXkgb2YgYnVmZmVyIGluZm9ybWF0aW9uIHN0cnVjdHMgKi8KIAlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwkvKiBhcnJheXMgb2YgcGFnZSBpbmZvcm1hdGlvbiBmb3IgcGFja2V0IHNwbGl0ICovCisJc3RydWN0IGUxMDAwX3BzX3BhZ2UgKnBzX3BhZ2U7CisJc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hICpwc19wYWdlX2RtYTsKIH07CiAKICNkZWZpbmUgRTEwMDBfREVTQ19VTlVTRUQoUikgXAogCSgoKChSKS0+bmV4dF90b19jbGVhbiA+IChSKS0+bmV4dF90b191c2UpID8gMCA6IChSKS0+Y291bnQpICsgXAogCShSKS0+bmV4dF90b19jbGVhbiAtIChSKS0+bmV4dF90b191c2UgLSAxKQogCisjZGVmaW5lIEUxMDAwX1JYX0RFU0NfUFMoUiwgaSkJICAgIFwKKwkoJigoKHVuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0ICopKChSKS5kZXNjKSlbaV0pKQorI2RlZmluZSBFMTAwMF9SWF9ERVNDX0VYVChSLCBpKQkgICAgXAorCSgmKCgodW5pb24gZTEwMDBfcnhfZGVzY19leHRlbmRlZCAqKSgoUikuZGVzYykpW2ldKSkKICNkZWZpbmUgRTEwMDBfR0VUX0RFU0MoUiwgaSwgdHlwZSkJKCYoKChzdHJ1Y3QgdHlwZSAqKSgoUikuZGVzYykpW2ldKSkKICNkZWZpbmUgRTEwMDBfUlhfREVTQyhSLCBpKQkJRTEwMDBfR0VUX0RFU0MoUiwgaSwgZTEwMDBfcnhfZGVzYykKICNkZWZpbmUgRTEwMDBfVFhfREVTQyhSLCBpKQkJRTEwMDBfR0VUX0RFU0MoUiwgaSwgZTEwMDBfdHhfZGVzYykKQEAgLTE5Miw2ICsyMDgsNyBAQAogCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9pbmZvX3RpbWVyOwogCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKyAgICAJdWludDE2X3QgbW5nX3ZsYW5faWQ7CiAJdWludDMyX3QgYmRfbnVtYmVyOwogCXVpbnQzMl90IHJ4X2J1ZmZlcl9sZW47CiAJdWludDMyX3QgcGFydF9udW07CkBAIC0yMjgsMTQgKzI0NSwyMyBAQAogCWJvb2xlYW5fdCBkZXRlY3RfdHhfaHVuZzsKIAogCS8qIFJYICovCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwlib29sZWFuX3QgKCpjbGVhbl9yeCkgKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBpbnQgKndvcmtfZG9uZSwKKwkJCSAgaW50IHdvcmtfdG9fZG8pOworI2Vsc2UKKwlib29sZWFuX3QgKCpjbGVhbl9yeCkgKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKKyNlbmRpZgorCXZvaWQgKCphbGxvY19yeF9idWYpIChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyByeF9yaW5nOwogCXVpbnQ2NF90IGh3X2NzdW1fZXJyOwogCXVpbnQ2NF90IGh3X2NzdW1fZ29vZDsKIAl1aW50MzJfdCByeF9pbnRfZGVsYXk7CiAJdWludDMyX3QgcnhfYWJzX2ludF9kZWxheTsKIAlib29sZWFuX3QgcnhfY3N1bTsKKwlib29sZWFuX3QgcnhfcHM7CiAJdWludDMyX3QgZ29yY2w7CiAJdWludDY0X3QgZ29yY2xfb2xkOworCXVpbnQxNl90IHJ4X3BzX2JzaXplMDsKIAogCS8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlICovCiAJdWludDMyX3QgaXRyOwpAQCAtMjU3LDUgKzI4Myw4IEBACiAKIAogCWludCBtc2dfZW5hYmxlOworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJYm9vbGVhbl90IGhhdmVfbXNpOworI2VuZGlmCiB9OwogI2VuZGlmIC8qIF9FMTAwMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCmluZGV4IDBhMmNhN2MuLjIzNzI0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIAotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKQEAgLTY5LDYgKzY5LDcgQEAKIAl7ICJyeF9jcmNfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfY3JjX2Vycm9ycykgfSwKIAl7ICJyeF9mcmFtZV9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMpIH0sCiAJeyAicnhfZmlmb19lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycykgfSwKKwl7ICJyeF9ub19idWZmZXJfY291bnQiLCBFMTAwMF9TVEFUKHN0YXRzLnJuYmMpIH0sCiAJeyAicnhfbWlzc2VkX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMpIH0sCiAJeyAidHhfYWJvcnRlZF9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycykgfSwKIAl7ICJ0eF9jYXJyaWVyX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKSB9LApAQCAtNTkzLDcgKzU5NCw3IEBACiAJdHhfb2xkID0gYWRhcHRlci0+dHhfcmluZzsKIAlyeF9vbGQgPSBhZGFwdGVyLT5yeF9yaW5nOwogCi0JaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkgCisJaWYoKHJpbmctPnJ4X21pbmlfcGVuZGluZykgfHwgKHJpbmctPnJ4X2p1bWJvX3BlbmRpbmcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKQEAgLTc4NCw4ICs3ODUsOCBAQAogCS8qIEhvb2sgdXAgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciBqdXN0IGZvciB0aGlzIHRlc3QgKi8KICAJaWYoIXJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgMCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSB7CiAgCQlzaGFyZWRfaW50ID0gRkFMU0U7Ci0gCX0gZWxzZSBpZihyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIFNBX1NISVJRLCAKLQkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2KSl7CisgCX0gZWxzZSBpZihyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIFNBX1NISVJRLAorCQkJICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKXsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtODQyLDEwICs4NDMsOCBAQAogCQkJICogdGVzdCBmYWlsZWQuCiAJCQkgKi8KIAkJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKLQkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgCi0JCQkJCSh+bWFzayAmIDB4MDAwMDdGRkYpKTsKLQkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgCi0JCQkJCSh+bWFzayAmIDB4MDAwMDdGRkYpKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgfm1hc2sgJiAweDAwMDA3RkZGKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgfm1hc2sgJiAweDAwMDA3RkZGKTsKIAkJCW1zZWNfZGVsYXkoMTApOwogCiAJCQlpZihhZGFwdGVyLT50ZXN0X2ljcikgewpAQCAtOTE5LDcgKzkxOCw4IEBACiAKIAkvKiBTZXR1cCBUeCBkZXNjcmlwdG9yIHJpbmcgYW5kIFR4IGJ1ZmZlcnMgKi8KIAotCXR4ZHItPmNvdW50ID0gODA7CisJaWYoIXR4ZHItPmNvdW50KQorCQl0eGRyLT5jb3VudCA9IEUxMDAwX0RFRkFVTFRfVFhEOyAgIAogCiAJc2l6ZSA9IHR4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpOwogCWlmKCEodHhkci0+YnVmZmVyX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgewpAQCAtOTc0LDcgKzk3NCw4IEBACiAKIAkvKiBTZXR1cCBSeCBkZXNjcmlwdG9yIHJpbmcgYW5kIFJ4IGJ1ZmZlcnMgKi8KIAotCXJ4ZHItPmNvdW50ID0gODA7CisJaWYoIXJ4ZHItPmNvdW50KQorCQlyeGRyLT5jb3VudCA9IEUxMDAwX0RFRkFVTFRfUlhEOyAgIAogCiAJc2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpOwogCWlmKCEocnhkci0+YnVmZmVyX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgewpAQCAtMTAwOCw3ICsxMDA5LDcgQEAKIAkJc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDKCpyeGRyLCBpKTsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCQlpZighKHNrYiA9IGFsbG9jX3NrYihFMTAwMF9SWEJVRkZFUl8yMDQ4ICsgTkVUX0lQX0FMSUdOLCAKKwkJaWYoIShza2IgPSBhbGxvY19za2IoRTEwMDBfUlhCVUZGRVJfMjA0OCArIE5FVF9JUF9BTElHTiwKIAkJCQlHRlBfS0VSTkVMKSkpIHsKIAkJCXJldF92YWwgPSA2OwogCQkJZ290byBlcnJfbm9tZW07CkBAIC0xMzEwLDMxICsxMzExLDYyIEBACiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50ZXN0X3R4X3Jpbmc7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCWludCBpLCByZXRfdmFsOworCWludCBpLCBqLCBrLCBsLCBsYywgZ29vZF9jbnQsIHJldF92YWw9MDsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CiAKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIHJ4ZHItPmNvdW50IC0gMSk7CiAKLQlmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWUxMDAwX2NyZWF0ZV9sYnRlc3RfZnJhbWUodHhkci0+YnVmZmVyX2luZm9baV0uc2tiLCAxMDI0KTsKLQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsIHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSwKLQkJCQkJICAgIHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCwKLQkJCQkJICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCX0KLQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIGkpOworCS8qIENhbGN1bGF0ZSB0aGUgbG9vcCBjb3VudCBiYXNlZCBvbiB0aGUgbGFyZ2VzdCBkZXNjcmlwdG9yIHJpbmcgCisJICogVGhlIGlkZWEgaXMgdG8gd3JhcCB0aGUgbGFyZ2VzdCByaW5nIGEgbnVtYmVyIG9mIHRpbWVzIHVzaW5nIDY0CisJICogc2VuZC9yZWNlaXZlIHBhaXJzIGR1cmluZyBlYWNoIGxvb3AKKwkgKi8KIAotCW1zZWNfZGVsYXkoMjAwKTsKKwlpZihyeGRyLT5jb3VudCA8PSB0eGRyLT5jb3VudCkKKwkJbGMgPSAoKHR4ZHItPmNvdW50IC8gNjQpICogMikgKyAxOworCWVsc2UKKwkJbGMgPSAoKHJ4ZHItPmNvdW50IC8gNjQpICogMikgKyAxOwogCi0JaSA9IDA7Ci0JZG8gewotCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGRldiwgcnhkci0+YnVmZmVyX2luZm9baV0uZG1hLAotCQkJCQkgICAgcnhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoLAotCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQotCQlyZXRfdmFsID0gZTEwMDBfY2hlY2tfbGJ0ZXN0X2ZyYW1lKHJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLnNrYiwKLQkJCQkJCSAgIDEwMjQpOwotCQlpKys7Ci0JfSB3aGlsZSAocmV0X3ZhbCAhPSAwICYmIGkgPCA2NCk7Ci0KKwlrID0gbCA9IDA7CisJZm9yKGogPSAwOyBqIDw9IGxjOyBqKyspIHsgLyogbG9vcCBjb3VudCBsb29wICovCisJCWZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsgLyogc2VuZCB0aGUgcGFja2V0cyAqLworCQkJZTEwMDBfY3JlYXRlX2xidGVzdF9mcmFtZSh0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IsIAorCQkJCQkxMDI0KTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwZGV2LCAKKwkJCQkJdHhkci0+YnVmZmVyX2luZm9ba10uZG1hLAorCQkJCSAgICAJdHhkci0+YnVmZmVyX2luZm9ba10ubGVuZ3RoLAorCQkJCSAgICAJUENJX0RNQV9UT0RFVklDRSk7CisJCQlpZih1bmxpa2VseSgrK2sgPT0gdHhkci0+Y291bnQpKSBrID0gMDsKKwkJfQorCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIGspOworCQltc2VjX2RlbGF5KDIwMCk7CisJCXRpbWUgPSBqaWZmaWVzOyAvKiBzZXQgdGhlIHN0YXJ0IHRpbWUgZm9yIHRoZSByZWNlaXZlICovCisJCWdvb2RfY250ID0gMDsKKwkJZG8geyAvKiByZWNlaXZlIHRoZSBzZW50IHBhY2tldHMgKi8KKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwZGV2LCAKKwkJCQkJcnhkci0+YnVmZmVyX2luZm9bbF0uZG1hLAorCQkJCSAgICAJcnhkci0+YnVmZmVyX2luZm9bbF0ubGVuZ3RoLAorCQkJCSAgICAJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkKKwkJCXJldF92YWwgPSBlMTAwMF9jaGVja19sYnRlc3RfZnJhbWUoCisJCQkJCXJ4ZHItPmJ1ZmZlcl9pbmZvW2xdLnNrYiwKKwkJCQkgICAJMTAyNCk7CisJCQlpZighcmV0X3ZhbCkKKwkJCQlnb29kX2NudCsrOworCQkJaWYodW5saWtlbHkoKytsID09IHJ4ZHItPmNvdW50KSkgbCA9IDA7CisJCQkvKiB0aW1lICsgMjAgbXNlY3MgKDIwMCBtc2VjcyBvbiAyLjQpIGlzIG1vcmUgdGhhbiAKKwkJCSAqIGVub3VnaCB0aW1lIHRvIGNvbXBsZXRlIHRoZSByZWNlaXZlcywgaWYgaXQncyAKKwkJCSAqIGV4Y2VlZGVkLCBicmVhayBhbmQgZXJyb3Igb2ZmCisJCQkgKi8KKwkJfSB3aGlsZSAoZ29vZF9jbnQgPCA2NCAmJiBqaWZmaWVzIDwgKHRpbWUgKyAyMCkpOworCQlpZihnb29kX2NudCAhPSA2NCkgeworCQkJcmV0X3ZhbCA9IDEzOyAvKiByZXRfdmFsIGlzIHRoZSBzYW1lIGFzIG1pcy1jb21wYXJlICovCisJCQlicmVhazsgCisJCX0KKwkJaWYoamlmZmllcyA+PSAodGltZSArIDIpKSB7CisJCQlyZXRfdmFsID0gMTQ7IC8qIGVycm9yIGNvZGUgZm9yIHRpbWUgb3V0IGVycm9yICovCisJCQlicmVhazsKKwkJfQorCX0gLyogZW5kIGxvb3AgY291bnQgbG9vcCAqLwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0xMzU0LDEzICsxMzg2LDEyIEBACiBlMTAwMF9saW5rX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQogewogCSpkYXRhID0gMDsKLQogCWlmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CiAJCWludCBpID0gMDsKIAkJYWRhcHRlci0+aHcuc2VyZGVzX2xpbmtfZG93biA9IFRSVUU7CiAKLQkJLyogb24gc29tZSBibGFkZSBzZXJ2ZXIgZGVzaWducyBsaW5rIGVzdGFibGlzaG1lbnQgKi8KLQkJLyogY291bGQgdGFrZSBhcyBsb25nIGFzIDItMyBtaW51dGVzLiAgICAgICAgICAgICAgKi8KKwkJLyogT24gc29tZSBibGFkZSBzZXJ2ZXIgZGVzaWducywgbGluayBlc3RhYmxpc2htZW50CisJCSAqIGNvdWxkIHRha2UgYXMgbG9uZyBhcyAyLTMgbWludXRlcyAqLwogCQlkbyB7CiAJCQllMTAwMF9jaGVja19mb3JfbGluaygmYWRhcHRlci0+aHcpOwogCQkJaWYgKGFkYXB0ZXItPmh3LnNlcmRlc19saW5rX2Rvd24gPT0gRkFMU0UpCkBAIC0xMzY4LDkgKzEzOTksMTEgQEAKIAkJCW1zZWNfZGVsYXkoMjApOwogCQl9IHdoaWxlIChpKysgPCAzNzUwKTsKIAotCQkqZGF0YSA9IDE7IAorCQkqZGF0YSA9IDE7CiAJfSBlbHNlIHsKIAkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKKwkJaWYoYWRhcHRlci0+aHcuYXV0b25lZykgIC8qIGlmIGF1dG9fbmVnIGlzIHNldCB3YWl0IGZvciBpdCAqLworCQkJbXNlY19kZWxheSg0MDAwKTsKIAogCQlpZighKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpIHsKIAkJCSpkYXRhID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IDc4NmE5YjkuLjcyMzU4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIApAQCAtNjMsMTAgKzYzLDExIEBACiBzdGF0aWMgaW50MzJfdCBlMTAwMF9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIGUxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHZvaWQgZTEwMDBfc3RhbmRieV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgaW50MzJfdCBlMTAwMF9pZF9sZWRfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKiBodyk7CiBzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXRfdmNvX3NwZWVkKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIGludDMyX3QgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBpbnQzMl90IGUxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqYnVmZmVyKTsKK3N0YXRpYyB1aW50OF90IGUxMDAwX2NhbGN1bGF0ZV9tbmdfY2hlY2tzdW0oY2hhciAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOwogCiAvKiBJR1AgY2FibGUgbGVuZ3RoIHRhYmxlICovCiBzdGF0aWMgY29uc3QKQEAgLTgwLDYgKzgxLDE3IEBACiAgICAgICAxMDAsIDEwMCwgMTAwLCAxMDAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsCiAgICAgICAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjB9OwogCitzdGF0aWMgY29uc3QKK3VpbnQxNl90IGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVtJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRV0gPQorICAgIHsgOCwgMTMsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywKKyAgICAgIDIyLCAyNCwgMjcsIDMwLCAzMiwgMzUsIDM3LCA0MCwgNDIsIDQ0LCA0NywgNDksIDUxLCA1NCwgNTYsIDU4LAorICAgICAgMzIsIDM1LCAzOCwgNDEsIDQ0LCA0NywgNTAsIDUzLCA1NSwgNTgsIDYxLCA2MywgNjYsIDY5LCA3MSwgNzQsCisgICAgICA0MywgNDcsIDUxLCA1NCwgNTgsIDYxLCA2NCwgNjcsIDcxLCA3NCwgNzcsIDgwLCA4MiwgODUsIDg4LCA5MCwKKyAgICAgIDU3LCA2MiwgNjYsIDcwLCA3NCwgNzcsIDgxLCA4NSwgODgsIDkxLCA5NCwgOTcsIDEwMCwgMTAzLCAxMDYsIDEwOCwKKyAgICAgIDczLCA3OCwgODIsIDg3LCA5MSwgOTUsIDk4LCAxMDIsIDEwNSwgMTA5LCAxMTIsIDExNCwgMTE3LCAxMTksIDEyMiwgMTI0LAorICAgICAgOTEsIDk2LCAxMDEsIDEwNSwgMTA5LCAxMTMsIDExNiwgMTE5LCAxMjIsIDEyNSwgMTI3LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwKKyAgICAgIDEwOCwgMTEzLCAxMTcsIDEyMSwgMTI0LCAxMjcsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH07CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU2V0IHRoZSBwaHkgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KQEAgLTkxLDEwICsxMDMsMTQgQEAKIHsKICAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfdHlwZSIpOwogCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwX3VuZGVmaW5lZCkKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CisKICAgICBzd2l0Y2goaHctPnBoeV9pZCkgewogICAgIGNhc2UgTTg4RTEwMDBfRV9QSFlfSUQ6CiAgICAgY2FzZSBNODhFMTAwMF9JX1BIWV9JRDoKICAgICBjYXNlIE04OEUxMDExX0lfUEhZX0lEOgorICAgIGNhc2UgTTg4RTExMTFfSV9QSFlfSUQ6CiAgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9tODg7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSUdQMDFFMTAwMF9JX1BIWV9JRDoKQEAgLTEyOCw3ICsxNDQsNiBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaW5pdF9zY3JpcHQiKTsKIAotCiAgICAgaWYoaHctPnBoeV9pbml0X3NjcmlwdCkgewogICAgICAgICBtc2VjX2RlbGF5KDIwKTsKIApAQCAtMjcxLDYgKzI4Niw3IEBACiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1BDSUU6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUjoKICAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDZfcmV2XzM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRUk6CkBAIC0yODksMTIgKzMwNSwxOSBAQAogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ3R0k6CiAgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ3X3Jldl8yOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3M0U6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzNFX0lBTVQ6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTczOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfTUFDX1RZUEU7CiAgICAgfQogCiAgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgIGh3LT5lZXByb21fc2VtYXBob3JlX3ByZXNlbnQgPSBUUlVFOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIGUxMDAwXzgyNTQxOgogICAgIGNhc2UgZTEwMDBfODI1NDc6CiAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKQEAgLTM2MCw2ICszODMsOSBAQAogICAgIHVpbnQzMl90IGljcjsKICAgICB1aW50MzJfdCBtYW5jOwogICAgIHVpbnQzMl90IGxlZF9jdHJsOworICAgIHVpbnQzMl90IHRpbWVvdXQ7CisgICAgdWludDMyX3QgZXh0Y25mX2N0cmw7CisgICAgaW50MzJfdCByZXRfdmFsOwogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9yZXNldF9odyIpOwogCkBAIC0zNjksNiArMzk1LDE1IEBACiAgICAgICAgIGUxMDAwX3BjaV9jbGVhcl9td2koaHcpOwogICAgIH0KIAorICAgIGlmKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykgeworICAgICAgICAvKiBQcmV2ZW50IHRoZSBQQ0ktRSBidXMgZnJvbSBzdGlja2luZyBpZiB0aGVyZSBpcyBubyBUTFAgY29ubmVjdGlvbgorICAgICAgICAgKiBvbiB0aGUgbGFzdCBUTFAgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiB3aGVuIE1BQyBpcyByZXNldC4KKyAgICAgICAgICovCisgICAgICAgIGlmKGUxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyKGh3KSAhPSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICBERUJVR09VVCgiUENJLUUgTWFzdGVyIGRpc2FibGUgcG9sbGluZyBoYXMgZmFpbGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayB0byBzdG9wIGJvYXJkIGZyb20gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzICovCiAgICAgREVCVUdPVVQoIk1hc2tpbmcgb2ZmIGFsbCBpbnRlcnJ1cHRzXG4iKTsKICAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNQywgMHhmZmZmZmZmZik7CkBAIC0zOTMsMTAgKzQyOCwzMiBAQAogCiAgICAgLyogTXVzdCByZXNldCB0aGUgUEhZIGJlZm9yZSByZXNldHRpbmcgdGhlIE1BQyAqLwogICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19JTyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOwogICAgICAgICBtc2VjX2RlbGF5KDUpOwogICAgIH0KIAorICAgIC8qIE11c3QgYWNxdWlyZSB0aGUgTURJTyBvd25lcnNoaXAgYmVmb3JlIE1BQyByZXNldC4KKyAgICAgKiBPd25lcnNoaXAgZGVmYXVsdHMgdG8gZmlybXdhcmUgYWZ0ZXIgYSByZXNldC4gKi8KKyAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKyAgICAgICAgdGltZW91dCA9IDEwOworCisgICAgICAgIGV4dGNuZl9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVYVENORl9DVFJMKTsKKyAgICAgICAgZXh0Y25mX2N0cmwgfD0gRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVA7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOworICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworCisgICAgICAgICAgICBpZihleHRjbmZfY3RybCAmIEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQOworCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIpOworICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICB9IHdoaWxlKHRpbWVvdXQpOworICAgIH0KKwogICAgIC8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncwogICAgICAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CiAgICAgICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQpAQCAtNDUwLDYgKzUwNywxOCBAQAogICAgICAgICAgICAgLyogV2FpdCBmb3IgRUVQUk9NIHJlbG9hZCAqLwogICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU3MzoKKyAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICBjdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfYXV0b19yZF9kb25lKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBjb250aW51ZSBhY2Nlc3NpbmcgTUFDIHJlZ2lzdGVycy4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLyogV2FpdCBmb3IgRUVQUk9NIHJlbG9hZCAoaXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5KSAqLwogICAgICAgICAgICAgbXNlY19kZWxheSg1KTsKQEAgLTQ1Nyw3ICs1MjYsNyBAQAogICAgIH0KIAogICAgIC8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLwotICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkgeworICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJiBody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKICAgICAgICAgbWFuYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKICAgICAgICAgbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBNQU5DLCBtYW5jKTsKQEAgLTUxMCw2ICs1NzksOCBAQAogICAgIHVpbnQxNl90IHBjaXhfc3RhdF9oaV93b3JkOwogICAgIHVpbnQxNl90IGNtZF9tbXJiYzsKICAgICB1aW50MTZfdCBzdGF0X21tcmJjOworICAgIHVpbnQzMl90IG10YV9zaXplOworCiAgICAgREVCVUdGVU5DKCJlMTAwMF9pbml0X2h3Iik7CiAKICAgICAvKiBJbml0aWFsaXplIElkZW50aWZpY2F0aW9uIExFRCAqLwpAQCAtNTI0LDggKzU5NSw4IEBACiAKICAgICAvKiBEaXNhYmxpbmcgVkxBTiBmaWx0ZXJpbmcuICovCiAgICAgREVCVUdPVVQoIkluaXRpYWxpemluZyB0aGUgSUVFRSBWTEFOXG4iKTsKLSAgICBFMTAwMF9XUklURV9SRUcoaHcsIFZFVCwgMCk7Ci0KKyAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDVfcmV2XzMpCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVkVULCAwKTsKICAgICBlMTAwMF9jbGVhcl92ZnRhKGh3KTsKIAogICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIGRpc2FibGUgTVdJIGFuZCBwdXQgdGhlIHJlY2VpdmVyIGludG8gcmVzZXQgKi8KQEAgLTU1MywxNCArNjI0LDE2IEBACiAKICAgICAvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KICAgICBERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQ19UQkxfU0laRTsgaSsrKQorICAgIG10YV9zaXplID0gRTEwMDBfTUNfVEJMX1NJWkU7CisgICAgZm9yKGkgPSAwOyBpIDwgbXRhX3NpemU7IGkrKykKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGksIDApOwogCiAgICAgLyogU2V0IHRoZSBQQ0kgcHJpb3JpdHkgYml0IGNvcnJlY3RseSBpbiB0aGUgQ1RSTCByZWdpc3Rlci4gIFRoaXMKICAgICAgKiBkZXRlcm1pbmVzIGlmIHRoZSBhZGFwdGVyIGdpdmVzIHByaW9yaXR5IHRvIHJlY2VpdmVzLCBvciBpZiBpdAotICAgICAqIGdpdmVzIGVxdWFsIHByaW9yaXR5IHRvIHRyYW5zbWl0cyBhbmQgcmVjZWl2ZXMuCisgICAgICogZ2l2ZXMgZXF1YWwgcHJpb3JpdHkgdG8gdHJhbnNtaXRzIGFuZCByZWNlaXZlcy4gIFZhbGlkIG9ubHkgb24KKyAgICAgKiA4MjU0MiBhbmQgODI1NDMgc2lsaWNvbi4KICAgICAgKi8KLSAgICBpZihody0+ZG1hX2ZhaXJuZXNzKSB7CisgICAgaWYoaHctPmRtYV9mYWlybmVzcyAmJiBody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDMpIHsKICAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QUklPUik7CiAgICAgfQpAQCAtNTk4LDkgKzY3MSwyMSBAQAogICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CiAgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgVFhEQ1RMKTsKICAgICAgICAgY3RybCA9IChjdHJsICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8IEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0I7CisgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU3MzoKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRYRENUTCwgY3RybCk7CiAgICAgfQogCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgeworICAgICAgICBlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhodyk7IAorICAgIH0KKworCiAgICAgLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0aXN0aWNzIHJlZ2lzdGVycyAoY2xlYXIgb24gcmVhZCkuICBJdCBpcwogICAgICAqIGltcG9ydGFudCB0aGF0IHdlIGRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZSB0cmllZCB0byBlc3RhYmxpc2ggbGluawogICAgICAqIGJlY2F1c2UgdGhlIHN5bWJvbCBlcnJvciBjb3VudCB3aWxsIGluY3JlbWVudCB3aWxkbHkgaWYgdGhlcmUKQEAgLTY3OSw3ICs3NjQsNyBAQAogICAgICAqIGNvbnRyb2wgc2V0dGluZywgdGhlbiB0aGUgdmFyaWFibGUgaHctPmZjIHdpbGwKICAgICAgKiBiZSBpbml0aWFsaXplZCBiYXNlZCBvbiBhIHZhbHVlIGluIHRoZSBFRVBST00uCiAgICAgICovCi0gICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLCAxLCAmZWVwcm9tX2RhdGEpKSB7CiAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKICAgICB9CkBAIC03MzYsNiArODIxLDcgQEAKICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDQUwsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyk7CiAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ0FILCBGTE9XX0NPTlRST0xfQUREUkVTU19ISUdIKTsKICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDVCwgRkxPV19DT05UUk9MX1RZUEUpOworCiAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1RUViwgaHctPmZjX3BhdXNlX3RpbWUpOwogCiAgICAgLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCkBAIC05MDYsMjAgKzk5MiwxOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIERldGVjdHMgd2hpY2ggUEhZIGlzIHByZXNlbnQgYW5kIHRoZSBzcGVlZCBhbmQgZHVwbGV4CisqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgUEhZIGFuZCBjaGFuZ2UgUEhZIG1vZGUgYmVmb3JlIGxpbmsgc2V0dXAuCiAqCiAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50MzJfdAotZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK2UxMDAwX2NvcHBlcl9saW5rX3ByZWNvbmZpZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogICAgIHVpbnQzMl90IGN0cmw7Ci0gICAgdWludDMyX3QgbGVkX2N0cmw7CiAgICAgaW50MzJfdCByZXRfdmFsOwotICAgIHVpbnQxNl90IGk7CiAgICAgdWludDE2X3QgcGh5X2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2NvcHBlcl9saW5rIik7CisgICAgREVCVUdGVU5DKCJlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWciKTsKIAogICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CiAgICAgLyogV2l0aCA4MjU0Mywgd2UgbmVlZCB0byBmb3JjZSBzcGVlZCBhbmQgZHVwbGV4IG9uIHRoZSBNQUMgZXF1YWwgdG8gd2hhdApAQCAtOTMzLDcgKzEwMTcsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFggfCBFMTAwMF9DVFJMX1NMVSk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7Ci0gICAgICAgIGUxMDAwX3BoeV9od19yZXNldChodyk7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAgICAgfQogCiAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBQSFkgKi8KQEAgLTk2MSwyNzQgKzEwNDcsMzk4IEBACiAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKICAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gRkFMU0U7CiAKLSAgICBpZighaHctPnBoeV9yZXNldF9kaXNhYmxlKSB7Ci0gICAgICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CiAKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgewotICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBSZXNldHRpbmcgdGhlIFBIWVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIFdhaXQgMTBtcyBmb3IgTUFDIHRvIGNvbmZpZ3VyZSBQSFkgZnJvbSBlZXByb20gc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIG1zZWNfZGVsYXkoMTUpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHBlciBsaW5rIHNldHVwIGZvciBlMTAwMF9waHlfaWdwIHNlcmllcy4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBsZWRfY3RybDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CiAKLSAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCi0gICAgICAgICAgICBsZWRfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOwotICAgICAgICAgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOwotICAgICAgICAgICAgbGVkX2N0cmwgfD0gKElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIHwgSUdQX0xFRDNfTU9ERSk7Ci0gICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgbGVkX2N0cmwpOworICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfaWdwX3NldHVwIik7CiAKLSAgICAgICAgICAgIC8qIGRpc2FibGUgbHBsdSBkMyBkdXJpbmcgZHJpdmVyIGluaXQgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShodywgRkFMU0UpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkgewotICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEM1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9CisgICAgaWYgKGh3LT5waHlfcmVzZXRfZGlzYWJsZSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgCisgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7CisgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQogCi0gICAgICAgICAgICAvKiBDb25maWd1cmUgbWRpLW1kaXggc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAvKiBXYWl0IDEwbXMgZm9yIE1BQyB0byBjb25maWd1cmUgUEhZIGZyb20gZWVwcm9tIHNldHRpbmdzICovCisgICAgbXNlY19kZWxheSgxNSk7CisKKyAgICAvKiBDb25maWd1cmUgYWN0aXZpdHkgTEVEIGFmdGVyIFBIWSByZXNldCAqLworICAgIGxlZF9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworICAgIGxlZF9jdHJsIHw9IChJR1BfQUNUSVZJVFlfTEVEX0VOQUJMRSB8IElHUF9MRUQzX01PREUpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRfY3RybCk7CisKKyAgICAvKiBkaXNhYmxlIGxwbHUgZDMgZHVyaW5nIGRyaXZlciBpbml0ICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9kM19scGx1X3N0YXRlKGh3LCBGQUxTRSk7CisgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIERpc2FibGluZyBMUExVIEQzXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgLyogZGlzYWJsZSBscGx1IGQwIGR1cmluZyBkcml2ZXIgaW5pdCAqLworICAgIHJldF92YWwgPSBlMTAwMF9zZXRfZDBfbHBsdV9zdGF0ZShodywgRkFMU0UpOworICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgIERFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEMFxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKyAgICAvKiBDb25maWd1cmUgbWRpLW1kaXggc2V0dGluZ3MgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsICZwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19kaXNhYmxlZDsKKyAgICAgICAgLyogRm9yY2UgTURJIGZvciBlYXJsaWVyIHJldnMgb2YgdGhlIElHUCBQSFkgKi8KKyAgICAgICAgcGh5X2RhdGEgJj0gfihJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYIHwgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYKTsKKyAgICAgICAgaHctPm1kaXggPSAxOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCisgICAgICAgIHN3aXRjaCAoaHctPm1kaXgpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9QU0NSX0FVVE9fTURJWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsIHBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIHNldCBhdXRvLW1hc3RlciBzbGF2ZSByZXNvbHV0aW9uIHNldHRpbmdzICovCisgICAgaWYoaHctPmF1dG9uZWcpIHsKKyAgICAgICAgZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CisKKyAgICAgICAgaWYoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUpCisgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKworICAgICAgICBpZihody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKKyAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworCisgICAgICAgIC8qIHdoZW4gYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudCBpcyBvbmx5IDEwMDBNYnBzIHRoZW4gd2UKKyAgICAgICAgICAqIHNob3VsZCBkaXNhYmxlIFNtYXJ0U3BlZWQgYW5kIGVuYWJsZSBBdXRvIE1hc3RlclNsYXZlCisgICAgICAgICAgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCisgICAgICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworICAgICAgICAgICAgLyogRGlzYWJsZSBTbWFydFNwZWVkICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgJnBoeV9kYXRhKTsKICAgICAgICAgICAgIGlmKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7Ci0gICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIE1ESSBmb3IgZWFybGllciByZXZzIG9mIHRoZSBJR1AgUEhZICovCi0gICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWCk7Ci0gICAgICAgICAgICAgICAgaHctPm1kaXggPSAxOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOwotICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChody0+bWRpeCkgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAgICAgLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIGlmKGh3LT5hdXRvbmVnKSB7Ci0gICAgICAgICAgICAgICAgZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7Ci0KLSAgICAgICAgICAgICAgICBpZihody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkKLSAgICAgICAgICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7Ci0KLSAgICAgICAgICAgICAgICBpZihody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKLSAgICAgICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiB3aGVuIGF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc21lbnQgaXMgb25seSAxMDAwTWJwcyB0aGVuIHdlCi0gICAgICAgICAgICAgICAgICogc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCBhbmQgZW5hYmxlIEF1dG8gTWFzdGVyU2xhdmUKLSAgICAgICAgICAgICAgICAgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCi0gICAgICAgICAgICAgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgU21hcnRTcGVlZCAqLwotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOwotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgICAgICAgICAgLyogbG9hZCBkZWZhdWx0cyBmb3IgZnV0dXJlIHVzZSAqLwotICAgICAgICAgICAgICAgIGh3LT5vcmlnaW5hbF9tYXN0ZXJfc2xhdmUgPSAocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19FTkFCTEUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwaHlfZGF0YSAmIENSXzEwMDBUX01TX1ZBTFVFKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX21zX2F1dG87Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoeV9tc19zZXR0aW5nKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlMTAwMF9tc19mb3JjZV9tYXN0ZXI6Ci0gICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IChDUl8xMDAwVF9NU19FTkFCTEUgfCBDUl8xMDAwVF9NU19WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZTEwMDBfbXNfZm9yY2Vfc2xhdmU6Ci0gICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IENSXzEwMDBUX01TX0VOQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihDUl8xMDAwVF9NU19WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZTEwMDBfbXNfYXV0bzoKLSAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBFbmFibGUgQ1JTIG9uIFRYLiBUaGlzIG11c3QgYmUgc2V0IGZvciBoYWxmLWR1cGxleCBvcGVyYXRpb24uICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwogICAgICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIC8qIFNldCBhdXRvIE1hc3Rlci9TbGF2ZSByZXNvbHV0aW9uIHByb2Nlc3MgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KIAotICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICAvKiBPcHRpb25zOgotICAgICAgICAgICAgICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQotICAgICAgICAgICAgICogICAwIC0gQXV0byBmb3IgYWxsIHNwZWVkcwotICAgICAgICAgICAgICogICAxIC0gTURJIG1vZGUKLSAgICAgICAgICAgICAqICAgMiAtIE1ESS1YIG1vZGUKLSAgICAgICAgICAgICAqICAgMyAtIEF1dG8gZm9yIDEwMDBCYXNlLVQgb25seSAoTURJLVggZm9yIDEwLzEwMEJhc2UtVCBtb2RlcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisgICAgICAgIC8qIGxvYWQgZGVmYXVsdHMgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICAgICAgaHctPm9yaWdpbmFsX21hc3Rlcl9zbGF2ZSA9IChwaHlfZGF0YSAmIENSXzEwMDBUX01TX0VOQUJMRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19WQUxVRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19mb3JjZV9zbGF2ZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19hdXRvOwogCi0gICAgICAgICAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKHBoeV9tc19zZXR0aW5nKSB7CisgICAgICAgIGNhc2UgZTEwMDBfbXNfZm9yY2VfbWFzdGVyOgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gKENSXzEwMDBUX01TX0VOQUJMRSB8IENSXzEwMDBUX01TX1ZBTFVFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX21zX2ZvcmNlX3NsYXZlOgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gQ1JfMTAwMFRfTVNfRU5BQkxFOworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihDUl8xMDAwVF9NU19WQUxVRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9tc19hdXRvOgorICAgICAgICAgICAgcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLyogT3B0aW9uczoKLSAgICAgICAgICAgICAqICAgZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gMCAoZGVmYXVsdCkKLSAgICAgICAgICAgICAqICAgICAgIEF1dG9tYXRpYyBDb3JyZWN0aW9uIGZvciBSZXZlcnNlZCBDYWJsZSBQb2xhcml0eQotICAgICAgICAgICAgICogICAwIC0gRGlzYWJsZWQKLSAgICAgICAgICAgICAqICAgMSAtIEVuYWJsZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7Ci0gICAgICAgICAgICBpZihody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID09IDEpCi0gICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQogCi0gICAgICAgICAgICAvKiBGb3JjZSBUWF9DTEsgaW4gdGhlIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyCi0gICAgICAgICAgICAgKiB0byAyNU1IeiBjbG9jay4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjU7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29wcGVyIGxpbmsgc2V0dXAgZm9yIGUxMDAwX3BoeV9tODggc2VyaWVzLgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKIAotICAgICAgICAgICAgaWYgKGh3LT5waHlfcmV2aXNpb24gPCBNODhFMTAxMV9JX1JFVl80KSB7Ci0gICAgICAgICAgICAgICAgLyogQ29uZmlndXJlIE1hc3RlciBhbmQgU2xhdmUgZG93bnNoaWZ0IHZhbHVlcyAqLwotICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH4oTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF9NQVNLIHwKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cCIpOworCisgICAgaWYoaHctPnBoeV9yZXNldF9kaXNhYmxlKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICAKKyAgICAvKiBFbmFibGUgQ1JTIG9uIFRYLiBUaGlzIG11c3QgYmUgc2V0IGZvciBoYWxmLWR1cGxleCBvcGVyYXRpb24uICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKworICAgIC8qIE9wdGlvbnM6CisgICAgICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQorICAgICAqICAgMCAtIEF1dG8gZm9yIGFsbCBzcGVlZHMKKyAgICAgKiAgIDEgLSBNREkgbW9kZQorICAgICAqICAgMiAtIE1ESS1YIG1vZGUKKyAgICAgKiAgIDMgLSBBdXRvIGZvciAxMDAwQmFzZS1UIG9ubHkgKE1ESS1YIGZvciAxMC8xMDBCYXNlLVQgbW9kZXMpCisgICAgICovCisgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisKKyAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7CisgICAgY2FzZSAxOgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX01ESV9NQU5VQUxfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfMTAwMFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBPcHRpb25zOgorICAgICAqICAgZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gMCAoZGVmYXVsdCkKKyAgICAgKiAgICAgICBBdXRvbWF0aWMgQ29ycmVjdGlvbiBmb3IgUmV2ZXJzZWQgQ2FibGUgUG9sYXJpdHkKKyAgICAgKiAgIDAgLSBEaXNhYmxlZAorICAgICAqICAgMSAtIEVuYWJsZWQKKyAgICAgKi8KKyAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKKyAgICBpZihody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID09IDEpCisgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIEZvcmNlIFRYX0NMSyBpbiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgKiB0byAyNU1IeiBjbG9jay4KKyAgICAgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKKworICAgIGlmIChody0+cGh5X3JldmlzaW9uIDwgTTg4RTEwMTFfSV9SRVZfNCkgeworICAgICAgICAvKiBDb25maWd1cmUgTWFzdGVyIGFuZCBTbGF2ZSBkb3duc2hpZnQgdmFsdWVzICovCisgICAgICAgIHBoeV9kYXRhICY9IH4oTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF9NQVNLIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9NQVNLKTsKLSAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSAoTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8xWCB8CisgICAgICAgIHBoeV9kYXRhIHw9IChNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzFYKTsKLSAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQorICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KIAotICAgICAgICAgICAgLyogU1cgUmVzZXQgdGhlIFBIWSBzbyBhbGwgY2hhbmdlcyB0YWtlIGVmZmVjdCAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIH0KKyAgICAvKiBTVyBSZXNldCB0aGUgUEhZIHNvIGFsbCBjaGFuZ2VzIHRha2UgZWZmZWN0ICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7CisgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0dXAgYXV0by1uZWdvdGlhdGlvbiBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnRzLAorKiBhbmQgdGhlbiBwZXJmb3JtIGF1dG8tbmVnb3RpYXRpb24uCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyIpOworCisgICAgLyogUGVyZm9ybSBzb21lIGJvdW5kcyBjaGVja2luZyBvbiB0aGUgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZAorICAgICAqIHBhcmFtZXRlci4gIElmIHRoaXMgdmFyaWFibGUgaXMgemVybywgdGhlbiBzZXQgaXQgdG8gdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCisgICAgLyogSWYgYXV0b25lZ19hZHZlcnRpc2VkIGlzIHplcm8sIHdlIGFzc3VtZSBpdCB3YXMgbm90IGRlZmF1bHRlZAorICAgICAqIGJ5IHRoZSBjYWxsaW5nIGNvZGUgc28gd2Ugc2V0IHRvIGFkdmVydGlzZSBmdWxsIGNhcGFiaWxpdHkuCisgICAgICovCisgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSAwKQorICAgICAgICBody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKworICAgIERFQlVHT1VUKCJSZWNvbmZpZ3VyaW5nIGF1dG8tbmVnIGFkdmVydGlzZW1lbnQgcGFyYW1zXG4iKTsKKyAgICByZXRfdmFsID0gZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoaHcpOworICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIFNldHRpbmcgdXAgQXV0by1OZWdvdGlhdGlvblxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKyAgICBERUJVR09VVCgiUmVzdGFydGluZyBBdXRvLU5lZ1xuIik7CisKKyAgICAvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gYnkgc2V0dGluZyB0aGUgQXV0byBOZWcgRW5hYmxlIGJpdCBhbmQKKyAgICAgKiB0aGUgQXV0byBOZWcgUmVzdGFydCBiaXQgaW4gdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyLgorICAgICAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2RhdGEgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8IE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIHBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIERvZXMgdGhlIHVzZXIgd2FudCB0byB3YWl0IGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZSBoZXJlLCBvcgorICAgICAqIGNoZWNrIGF0IGEgbGF0ZXIgdGltZSAoZm9yIGV4YW1wbGUsIGNhbGxiYWNrIHJvdXRpbmUpLgorICAgICAqLworICAgIGlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dhaXRfYXV0b25lZyhodyk7CisgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8qIE9wdGlvbnM6Ci0gICAgICAgICAqICAgYXV0b25lZyA9IDEgKGRlZmF1bHQpCi0gICAgICAgICAqICAgICAgUEhZIHdpbGwgYWR2ZXJ0aXNlIHZhbHVlKHMpIHBhcnNlZCBmcm9tCi0gICAgICAgICAqICAgICAgYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYwotICAgICAgICAgKiAgIGF1dG9uZWcgPSAwCi0gICAgICAgICAqICAgICAgUEhZIHdpbGwgYmUgc2V0IHRvIDEwSCwgMTBGLCAxMDBILCBvciAxMDBGCi0gICAgICAgICAqICAgICAgZGVwZW5kaW5nIG9uIHZhbHVlIHBhcnNlZCBmcm9tIGZvcmNlZF9zcGVlZF9kdXBsZXguCi0gICAgICAgICAqLworICAgIGh3LT5nZXRfbGlua19zdGF0dXMgPSBUUlVFOwogCi0gICAgICAgIC8qIElzIGF1dG9uZWcgZW5hYmxlZD8gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9yIGJ5IHNvZnR3YXJlCi0gICAgICAgICAqIG92ZXJyaWRlLiAgSWYgc28sIGNhbGwgZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcgcm91dGluZSB0byBwYXJzZSB0aGUKLSAgICAgICAgICogYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYyBvcHRpb25zLiBJZiBhdXRvbmVnIGlzIE5PVCBlbmFibGVkLCB0aGVuCi0gICAgICAgICAqIHRoZSB1c2VyIHNob3VsZCBoYXZlIHByb3ZpZGVkIGEgc3BlZWQvZHVwbGV4IG92ZXJyaWRlLiAgSWYgc28sIHRoZW4KLSAgICAgICAgICogY2FsbCBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4IHRvIHBhcnNlIGFuZCBzZXQgdGhpcyB1cC4KLSAgICAgICAgICovCi0gICAgICAgIGlmKGh3LT5hdXRvbmVnKSB7Ci0gICAgICAgICAgICAvKiBQZXJmb3JtIHNvbWUgYm91bmRzIGNoZWNraW5nIG9uIHRoZSBody0+YXV0b25lZ19hZHZlcnRpc2VkCi0gICAgICAgICAgICAgKiBwYXJhbWV0ZXIuICBJZiB0aGlzIHZhcmlhYmxlIGlzIHplcm8sIHRoZW4gc2V0IGl0IHRvIHRoZSBkZWZhdWx0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBody0+YXV0b25lZ19hZHZlcnRpc2VkICY9IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQ7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CiAKLSAgICAgICAgICAgIC8qIElmIGF1dG9uZWdfYWR2ZXJ0aXNlZCBpcyB6ZXJvLCB3ZSBhc3N1bWUgaXQgd2FzIG5vdCBkZWZhdWx0ZWQKLSAgICAgICAgICAgICAqIGJ5IHRoZSBjYWxsaW5nIGNvZGUgc28gd2Ugc2V0IHRvIGFkdmVydGlzZSBmdWxsIGNhcGFiaWxpdHkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gMCkKLSAgICAgICAgICAgICAgICBody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKIAotICAgICAgICAgICAgREVCVUdPVVQoIlJlY29uZmlndXJpbmcgYXV0by1uZWcgYWR2ZXJ0aXNlbWVudCBwYXJhbXNcbiIpOwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKGh3KTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgU2V0dGluZyB1cCBBdXRvLU5lZ290aWF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFQlVHT1VUKCJSZXN0YXJ0aW5nIEF1dG8tTmVnXG4iKTsKLQotICAgICAgICAgICAgLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIGJ5IHNldHRpbmcgdGhlIEF1dG8gTmVnIEVuYWJsZSBiaXQgYW5kCi0gICAgICAgICAgICAgKiB0aGUgQXV0byBOZWcgUmVzdGFydCBiaXQgaW4gdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgICAgIC8qIERvZXMgdGhlIHVzZXIgd2FudCB0byB3YWl0IGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZSBoZXJlLCBvcgotICAgICAgICAgICAgICogY2hlY2sgYXQgYSBsYXRlciB0aW1lIChmb3IgZXhhbXBsZSwgY2FsbGJhY2sgcm91dGluZSkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKLSAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd2FpdF9hdXRvbmVnKGh3KTsKLSAgICAgICAgICAgICAgICBpZihyZXRfdmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHctPmdldF9saW5rX3N0YXR1cyA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiRm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KGh3KTsKLSAgICAgICAgICAgIGlmKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgRm9yY2luZyBTcGVlZCBhbmQgRHVwbGV4XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29uZmlnIHRoZSBNQUMgYW5kIHRoZSBQSFkgYWZ0ZXIgbGluayBpcyB1cC4KKyogICAxKSBTZXQgdXAgdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CisqICAgICAgaWYgd2UgYXJlIG9uIDgyNTQzLiAgSWYgd2UKKyogICAgICBhcmUgb24gbmV3ZXIgc2lsaWNvbiwgd2Ugb25seSBuZWVkIHRvIGNvbmZpZ3VyZQorKiAgICAgIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3Rlci4KKyogICAyKSBTZXQgdXAgZmxvdyBjb250cm9sIG9uIHRoZSBNQUMgdG8gdGhhdCBlc3RhYmxpc2hlZCB3aXRoCisqICAgICAgdGhlIGxpbmsgcGFydG5lci4KKyogICAzKSBDb25maWcgRFNQIHRvIGltcHJvdmUgR2lnYWJpdCBsaW5rIHF1YWxpdHkgZm9yIHNvbWUgUEhZIHJldmlzaW9ucy4gICAgCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29wcGVyX2xpbmtfcG9zdGNvbmZpZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWciKTsKKyAgICAKKyAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKICAgICAgICAgfQotICAgIH0gLyogIWh3LT5waHlfcmVzZXRfZGlzYWJsZSAqLworICAgIH0KKyAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpOworICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIEZsb3cgQ29udHJvbFxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIENvbmZpZyBEU1AgdG8gaW1wcm92ZSBHaWdhIGxpbmsgcXVhbGl0eSAqLworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCBUUlVFKTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIERTUCBhZnRlciBsaW5rIHVwXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorICAgICAgICAgICAgICAgIAorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERldGVjdHMgd2hpY2ggUEhZIGlzIHByZXNlbnQgYW5kIHNldHVwIHRoZSBzcGVlZCBhbmQgZHVwbGV4CisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsiKTsKKworICAgIC8qIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgUEhZIGFuZCBzZXQgUEhZIG1vZGUgaWYgbmVjZXNzYXJ5LiAqLworICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoaHcpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8CisgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2lncF9zZXR1cChodyk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19tZ3Bfc2V0dXAoaHcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgaWYoaHctPmF1dG9uZWcpIHsKKyAgICAgICAgLyogU2V0dXAgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgCisgICAgICAgICAgKiBhbmQgcGVyZm9ybSBhdXRvbmVnb3RpYXRpb24gKi8gICAKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2F1dG9uZWcoaHcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7ICAgICAgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBQSFkgd2lsbCBiZSBzZXQgdG8gMTBILCAxMEYsIDEwMEgsb3IgMTAwRgorICAgICAgICAgICogZGVwZW5kaW5nIG9uIHZhbHVlIGZyb20gZm9yY2VkX3NwZWVkX2R1cGxleC4gKi8KKyAgICAgICAgREVCVUdPVVQoIkZvcmNpbmcgc3BlZWQgYW5kIGR1cGxleFxuIik7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KGh3KTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIEZvcmNpbmcgU3BlZWQgYW5kIER1cGxleFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qIENoZWNrIGxpbmsgc3RhdHVzLiBXYWl0IHVwIHRvIDEwMCBtaWNyb3NlY29uZHMgZm9yIGxpbmsgdG8gYmVjb21lCiAgICAgICogdmFsaWQuCkBAIC0xMjQyLDM3ICsxNDUyLDExIEBACiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICBpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgewotICAgICAgICAgICAgLyogV2UgaGF2ZSBsaW5rLCBzbyB3ZSBuZWVkIHRvIGZpbmlzaCB0aGUgY29uZmlnIHByb2Nlc3M6Ci0gICAgICAgICAgICAgKiAgIDEpIFNldCB1cCB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKLSAgICAgICAgICAgICAqICAgICAgaWYgd2UgYXJlIG9uIDgyNTQzLiAgSWYgd2UKLSAgICAgICAgICAgICAqICAgICAgYXJlIG9uIG5ld2VyIHNpbGljb24sIHdlIG9ubHkgbmVlZCB0byBjb25maWd1cmUKLSAgICAgICAgICAgICAqICAgICAgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyLgotICAgICAgICAgICAgICogICAyKSBTZXQgdXAgZmxvdyBjb250cm9sIG9uIHRoZSBNQUMgdG8gdGhhdCBlc3RhYmxpc2hlZCB3aXRoCi0gICAgICAgICAgICAgKiAgICAgIHRoZSBsaW5rIHBhcnRuZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgewotICAgICAgICAgICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfbWFjX3RvX3BoeShodyk7Ci0gICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkgewotICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7Ci0gICAgICAgICAgICBpZihyZXRfdmFsKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIEZsb3cgQ29udHJvbFxuIik7CisgICAgICAgICAgICAvKiBDb25maWcgdGhlIE1BQyBhbmQgUEhZIGFmdGVyIGxpbmsgaXMgdXAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wb3N0Y29uZmlnKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgbGluayBlc3RhYmxpc2hlZCEhIVxuIik7Ci0KLSAgICAgICAgICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7Ci0gICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIERTUCBhZnRlciBsaW5rIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgCiAgICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgbGluayBlc3RhYmxpc2hlZCEhIVxuIik7CiAgICAgICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKICAgICAgICAgfQpAQCAtMTMwMiwxMCArMTQ4NiwxMCBAQAogICAgIGlmKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJm1paV8xMDAwdF9jdHJsX3JlZyk7Ci0gICAgaWYocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmbWlpXzEwMDB0X2N0cmxfcmVnKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCiAgICAgLyogTmVlZCB0byBwYXJzZSBib3RoIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgYW5kIHNldCB1cAogICAgICAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAgRmlyc3Qgd2Ugd2lsbCBwYXJzZSBmb3IKQEAgLTE0MTcsNyArMTYwMSw3IEBACiAKICAgICBERUJVR09VVDEoIkF1dG8tTmVnIEFkdmVydGlzaW5nICV4XG4iLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKIAotICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgbWlpXzEwMDB0X2N0cmxfcmVnKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIG1paV8xMDAwdF9jdHJsX3JlZyk7ICAgIAogICAgIGlmKHJldF92YWwpCiAgICAgICAgIHJldHVybiByZXRfdmFsOwogCkBAIC0xNjc4LDYgKzE4NjIsMTEgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX21hY190b19waHkiKTsKIAorICAgIC8qIDgyNTQ0IG9yIG5ld2VyIE1BQywgQXV0byBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiAKKyAgICAqIE1BQyBzcGVlZC9kdXBsZXggY29uZmlndXJhdGlvbi4qLworICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCiAgICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgYW5kIHNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZAogICAgICAqIGFuZCBEdXBsZXguCiAgICAgICovCkBAIC0xNjg4LDQ1ICsxODc3LDI1IEBACiAgICAgLyogU2V0IHVwIGR1cGxleCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgYW5kIFRyYW5zbWl0IENvbnRyb2wKICAgICAgKiByZWdpc3RlcnMgZGVwZW5kaW5nIG9uIG5lZ290aWF0ZWQgdmFsdWVzLgogICAgICAqLwotICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGlmKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX0ZVTExfRFVQTEVYKSBjdHJsIHw9IEUxMDAwX0NUUkxfRkQ7Ci0gICAgICAgIGVsc2UgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKyAgICBpZihwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfRFBMWCkgCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKyAgICBlbHNlIAorICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOwogCi0gICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKIAotICAgICAgICAvKiBTZXQgdXAgc3BlZWQgaW4gdGhlIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGRlcGVuZGluZyBvbgotICAgICAgICAgKiBuZWdvdGlhdGVkIHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQotICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMpCi0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7Ci0gICAgICAgIGVsc2UgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09Ci0gICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwME1CUFMpCi0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIC8qIFNldCB1cCBzcGVlZCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgZGVwZW5kaW5nIG9uCisgICAgICogbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKQorICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisgICAgZWxzZSBpZigocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwME1CUykKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CiAKLSAgICAgICAgaWYocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKLSAgICAgICAgZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOwotCi0gICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7Ci0KLSAgICAgICAgLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KLSAgICAgICAgICogbmVnb3RpYXRlZCB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZigocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCi0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7Ci0gICAgICAgIGVsc2UgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCi0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKLSAgICB9CiAgICAgLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOwogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwpAQCAtMjQ5NCw4ICsyNjYzLDggQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnIik7CiAKLQotICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmCisgICAgaWYoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8IAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSAmJgogICAgICAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJlZ19hZGRyKTsKQEAgLTI2MDAsOCArMjc2OSw4IEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWciKTsKIAotCi0gICAgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgJiYKKyAgICBpZigoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwgCisgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpICYmCiAgICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpOwpAQCAtMjY3OSwxOSArMjg0OCwyNyBAQAogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmV0dXJucyB0aGUgUEhZIHRvIHRoZSBwb3dlci1vbiByZXNldCBzdGF0ZQogKgogKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAoraW50MzJfdAogZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAgICAgdWludDMyX3QgY3RybCwgY3RybF9leHQ7CiAgICAgdWludDMyX3QgbGVkX2N0cmw7CisgICAgaW50MzJfdCByZXRfdmFsOwogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKIAorICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBwaHkgcmVzZXQgYmVpbmcgYmxvY2tlZCwgaXQncyBub3QgYW4gZXJyb3IsIHdlCisgICAgICogc2ltcGx5IHJldHVybiBzdWNjZXNzIHdpdGhvdXQgcGVyZm9ybWluZyB0aGUgcmVzZXQuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodyk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCiAgICAgREVCVUdPVVQoIlJlc2V0dGluZyBQaHkuLi5cbiIpOwogCiAgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKQEAgLTI3MjcsNiArMjkwNCwxMSBAQAogICAgICAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGxlZF9jdHJsKTsKICAgICB9CisKKyAgICAvKiBXYWl0IGZvciBGVyB0byBmaW5pc2ggUEhZIGNvbmZpZ3VyYXRpb24uICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9waHlfY2ZnX2RvbmUoaHcpOworCisgICAgcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3NDQsNyArMjkyNiwxOSBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfcmVzZXQiKTsKIAotICAgIGlmKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0MV9yZXZfMikgeworICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBwaHkgcmVzZXQgYmVpbmcgYmxvY2tlZCwgaXQncyBub3QgYW4gZXJyb3IsIHdlCisgICAgICogc2ltcGx5IHJldHVybiBzdWNjZXNzIHdpdGhvdXQgcGVyZm9ybWluZyB0aGUgcmVzZXQuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodyk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJnBoeV9kYXRhKTsKICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwpAQCAtMjc1NSw5ICsyOTQ5LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAogICAgICAgICB1ZGVsYXkoMSk7Ci0gICAgfSBlbHNlIGUxMDAwX3BoeV9od19yZXNldChodyk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKQorICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8IGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpCiAgICAgICAgIGUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CiAKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKQEAgLTI4MTEsNiArMzAwNiw5IEBACiAgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKICAgICAgICAgaWYoaHctPnBoeV9pZCA9PSBJR1AwMUUxMDAwX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTExMTFfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgREVCVUdPVVQxKCJJbnZhbGlkIE1BQyB0eXBlICVkXG4iLCBody0+bWFjX3R5cGUpOwogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CkBAIC0yODY2LDcgKzMwNjQsNyBAQAogCiAgICAgLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCiAgICAgICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLwotICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSBody0+c3BlZWRfZG93bmdyYWRlZDsKKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gKGUxMDAwX2Rvd25zaGlmdClody0+c3BlZWRfZG93bmdyYWRlZDsKIAogICAgIC8qIElHUDAxRTEwMDAgZG9lcyBub3QgbmVlZCB0byBzdXBwb3J0IGl0LiAqLwogICAgIHBoeV9pbmZvLT5leHRlbmRlZF8xMGJ0X2Rpc3RhbmNlID0gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOwpAQCAtMjkwNSw3ICszMTAzLDcgQEAKICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCi0gICAgICAgIC8qIHRyYW5zYWx0ZSB0byBvbGQgbWV0aG9kICovCisgICAgICAgIC8qIFRyYW5zbGF0ZSB0byBvbGQgbWV0aG9kICovCiAgICAgICAgIGF2ZXJhZ2UgPSAobWF4X2xlbmd0aCArIG1pbl9sZW5ndGgpIC8gMjsKIAogICAgICAgICBpZihhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApCkBAIC0yOTQwLDcgKzMxMzgsNyBAQAogCiAgICAgLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCiAgICAgICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLwotICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSBody0+c3BlZWRfZG93bmdyYWRlZDsKKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gKGUxMDAwX2Rvd25zaGlmdClody0+c3BlZWRfZG93bmdyYWRlZDsKIAogICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CiAgICAgaWYocmV0X3ZhbCkKQEAgLTMwMjksNyArMzIyNyw4IEBACiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKICAgICB9CiAKLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkKKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCB8fAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKQogICAgICAgICByZXR1cm4gZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhodywgcGh5X2luZm8pOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9tODhfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKQEAgLTMwNTUsMTEgKzMyNTQsMTIgQEAKICAqCiAgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAoraW50MzJfdAogZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKICAgICB1aW50MzJfdCBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CiAgICAgdWludDE2X3QgZWVwcm9tX3NpemU7CiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyIpOwpAQCAtMzA3NCw2ICszMjc0LDggQEAKICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CiAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKICAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisgICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBGQUxTRTsKKyAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IEZBTFNFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIGUxMDAwXzgyNTQwOgogICAgIGNhc2UgZTEwMDBfODI1NDU6CkBAIC0zMDkwLDYgKzMyOTIsOCBAQAogICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKICAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CisgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBGQUxTRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBlMTAwMF84MjU0MToKICAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgpAQCAtMzExOCw0MiArMzMyMiw2MCBAQAogICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CisgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU3MzoKKyAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX3NwaTsKKyAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisgICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9BRERSX0JJVFMpIHsKKyAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gMzI7CisgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSA4OworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICB9CisgICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBUUlVFOworICAgICAgICBlZXByb20tPnVzZV9lZXdyID0gVFJVRTsKKyAgICAgICAgaWYoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX2ZsYXNoOworICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyMDQ4OworCisgICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgQXV0b25vbW91cyBGTEFTSCB1cGRhdGUgYml0IGlzIGNsZWFyZWQgZHVlIHRvCisgICAgICAgICAgICAgKiBGbGFzaCB1cGRhdGUgaXNzdWUgb24gcGFydHMgd2hpY2ggdXNlIGEgRkxBU0ggZm9yIE5WTS4gKi8KKyAgICAgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfQVVQREVOOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKLSAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKLSAgICAgICAgaWYgKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fQ0ZHLCAxLCAmZWVwcm9tX3NpemUpID09IDApIHsKLSAgICAgICAgICAgIGVlcHJvbV9zaXplICY9IEVFUFJPTV9TSVpFX01BU0s7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZWVwcm9tX3NpemUpIHsKLSAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfMTZLQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDgxOTI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzhLQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDQwOTY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzRLQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDIwNDg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzJLQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDEwMjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzFLQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDUxMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfNTEyQjoKLSAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfMTI4QjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLyogZWVwcm9tX3NpemUgd2lsbCBiZSBhbiBlbnVtIFswLi44XSB0aGF0IG1hcHMgdG8gZWVwcm9tIHNpemVzIDEyOEIgdG8KKyAgICAgICAgICogMzJLQiAoaW5jcmVtZW50ZWQgYnkgcG93ZXJzIG9mIDIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgICAgICAvKiBTZXQgdG8gZGVmYXVsdCB2YWx1ZSBmb3IgaW5pdGlhbCBlZXByb20gcmVhZC4gKi8KKyAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9DRkcsIDEsICZlZXByb21fc2l6ZSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgZWVwcm9tX3NpemUgPSAoZWVwcm9tX3NpemUgJiBFRVBST01fU0laRV9NQVNLKSA+PiBFRVBST01fU0laRV9TSElGVDsKKyAgICAgICAgICAgIC8qIDI1NkIgZWVwcm9tIHNpemUgd2FzIG5vdCBzdXBwb3J0ZWQgaW4gZWFybGllciBoYXJkd2FyZSwgc28gd2UKKyAgICAgICAgICAgICAqIGJ1bXAgZWVwcm9tX3NpemUgdXAgb25lIHRvIGVuc3VyZSB0aGF0ICIxIiAod2hpY2ggbWFwcyB0byAyNTZCKQorICAgICAgICAgICAgICogaXMgbmV2ZXIgdGhlIHJlc3VsdCB1c2VkIGluIHRoZSBzaGlmdGluZyBsb2dpYyBiZWxvdy4gKi8KKyAgICAgICAgICAgIGlmKGVlcHJvbV9zaXplKQorICAgICAgICAgICAgICAgIGVlcHJvbV9zaXplKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZXByb21fc2l6ZSA9ICh1aW50MTZfdCkoKGVlY2QgJiBFMTAwMF9FRUNEX1NJWkVfRVhfTUFTSykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfRUVDRF9TSVpFX0VYX1NISUZUKTsKICAgICAgICAgfQorCisgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gMSA8PCAoZWVwcm9tX3NpemUgKyBFRVBST01fV09SRF9TSVpFX1NISUZUKTsKICAgICB9CisgICAgcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzMDYsOCArMzUyOCwxMiBAQAogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9hY3F1aXJlX2VlcHJvbSIpOwogCisgICAgaWYoZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpKQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisKICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOwogCisgICAgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MykgewogICAgIC8qIFJlcXVlc3QgRUVQUk9NIEFjY2VzcyAqLwogICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CiAgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9SRVE7CkBAIC0zMzI2LDYgKzM1NTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgICAgICB9CiAgICAgfQorICAgIH0KIAogICAgIC8qIFNldHVwIEVFUFJPTSBmb3IgUmVhZC9Xcml0ZSAqLwogCkBAIC0zNDQzLDYgKzM2NzAsOCBAQAogICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1JFUTsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKICAgICB9CisKKyAgICBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1MDQsOCArMzczMywxMCBAQAogewogICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CiAgICAgdWludDMyX3QgaSA9IDA7CisgICAgaW50MzJfdCByZXRfdmFsOwogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2VlcHJvbSIpOworCiAgICAgLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAogICAgICAqIGVub3VnaCB3b3Jkcy4KICAgICAgKi8KQEAgLTM1MTUsOSArMzc0NiwyMyBAQAogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CiAgICAgfQogCi0gICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciByZWFkaW5nICAqLwotICAgIGlmKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgLyogRkxBU0ggcmVhZHMgd2l0aG91dCBhY3F1aXJpbmcgdGhlIHNlbWFwaG9yZSBhcmUgc2FmZSBpbiA4MjU3My1iYXNlZAorICAgICAqIGNvbnRyb2xsZXJzLgorICAgICAqLworICAgIGlmICgoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSA9PSBUUlVFKSB8fAorICAgICAgICAoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTczKSkgeworICAgICAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisgICAgICAgIGlmKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIGlmKGVlcHJvbS0+dXNlX2VlcmQgPT0gVFJVRSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb21fZWVyZChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisgICAgICAgIGlmICgoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSA9PSBUUlVFKSB8fAorICAgICAgICAgICAgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MykpCisgICAgICAgICAgICBlMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KIAogICAgIGlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CiAgICAgICAgIHVpbnQxNl90IHdvcmRfaW47CkBAIC0zNTY5LDYgKzM4MTQsMTMyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSBFRVJEIHJlZ2lzdGVyLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9lZXByb21fZWVyZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCBpLCBlZXJkID0gMDsKKyAgICBpbnQzMl90IGVycm9yID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisgICAgICAgIGVlcmQgPSAoKG9mZnNldCtpKSA8PCBFMTAwMF9FRVBST01fUldfQUREUl9TSElGVCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0VFUFJPTV9SV19SRUdfU1RBUlQ7CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRVJELCBlZXJkKTsKKyAgICAgICAgZXJyb3IgPSBlMTAwMF9wb2xsX2VlcmRfZWV3cl9kb25lKGh3LCBFMTAwMF9FRVBST01fUE9MTF9SRUFEKTsKKyAgICAgICAgCisgICAgICAgIGlmKGVycm9yKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkYXRhW2ldID0gKEUxMDAwX1JFQURfUkVHKGh3LCBFRVJEKSA+PiBFMTAwMF9FRVBST01fUldfUkVHX0RBVEEpOworICAgICAgCisgICAgfQorICAgIAorICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSBFRVdSIHJlZ2lzdGVyLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tX2Vld3Ioc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpCit7CisgICAgdWludDMyX3QgICAgcmVnaXN0ZXJfdmFsdWUgPSAwOworICAgIHVpbnQzMl90ICAgIGkgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQzMl90ICAgICBlcnJvciAgICAgICAgICA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworICAgICAgICByZWdpc3Rlcl92YWx1ZSA9IChkYXRhW2ldIDw8IEUxMDAwX0VFUFJPTV9SV19SRUdfREFUQSkgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKG9mZnNldCtpKSA8PCBFMTAwMF9FRVBST01fUldfQUREUl9TSElGVCkgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUOworCisgICAgICAgIGVycm9yID0gZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShodywgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUpOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgICAgCisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRVdSLCByZWdpc3Rlcl92YWx1ZSk7CisgICAgICAgIAorICAgICAgICBlcnJvciA9IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoaHcsIEUxMDAwX0VFUFJPTV9QT0xMX1dSSVRFKTsKKyAgICAgICAgCisgICAgICAgIGlmKGVycm9yKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb2xscyB0aGUgc3RhdHVzIGJpdCAoYml0IDEpIG9mIHRoZSBFRVJEIHRvIGRldGVybWluZSB3aGVuIHRoZSByZWFkIGlzIGRvbmUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodywgaW50IGVlcmQpCit7CisgICAgdWludDMyX3QgYXR0ZW1wdHMgPSAxMDAwMDA7CisgICAgdWludDMyX3QgaSwgcmVnID0gMDsKKyAgICBpbnQzMl90IGRvbmUgPSBFMTAwMF9FUlJfRUVQUk9NOworCisgICAgZm9yKGkgPSAwOyBpIDwgYXR0ZW1wdHM7IGkrKykgeworICAgICAgICBpZihlZXJkID09IEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpCisgICAgICAgICAgICByZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVSRCk7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICByZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVXUik7CisKKyAgICAgICAgaWYocmVnICYgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FKSB7CisgICAgICAgICAgICBkb25lID0gRTEwMDBfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVkZWxheSg1KTsKKyAgICB9CisKKyAgICByZXR1cm4gZG9uZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZXNjcmlwdGlvbjogICAgIERldGVybWluZXMgaWYgdGhlIG9uYm9hcmQgTlZNIGlzIEZMQVNIIG9yIEVFUFJPTS4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2UxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGVlY2QgPSAwOworCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CisgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKyAgICAgICAgLyogSXNvbGF0ZSBiaXRzIDE1ICYgMTYgKi8KKyAgICAgICAgZWVjZCA9ICgoZWVjZCA+PiAxNSkgJiAweDAzKTsKKworICAgICAgICAvKiBJZiBib3RoIGJpdHMgYXJlIHNldCwgZGV2aWNlIGlzIEZsYXNoIHR5cGUgKi8KKyAgICAgICAgaWYoZWVjZCA9PSAweDAzKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFZlcmlmaWVzIHRoYXQgdGhlIEVFUFJPTSBoYXMgYSB2YWxpZCBjaGVja3N1bQogICoKICAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCkBAIC0zNTg1LDYgKzM5NTYsMjUgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CiAKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgJiYKKyAgICAgICAgKGUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShodykgPT0gRkFMU0UpKSB7CisgICAgICAgIC8qIENoZWNrIGJpdCA0IG9mIHdvcmQgMTBoLiAgSWYgaXQgaXMgMCwgZmlybXdhcmUgaXMgZG9uZSB1cGRhdGluZworICAgICAgICAgKiAxMGgtMTJoLiAgQ2hlY2tzdW0gbWF5IG5lZWQgdG8gYmUgZml4ZWQuICovCisgICAgICAgIGUxMDAwX3JlYWRfZWVwcm9tKGh3LCAweDEwLCAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICBpZiAoKGVlcHJvbV9kYXRhICYgMHgxMCkgPT0gMCkgeworICAgICAgICAgICAgLyogUmVhZCAweDIzIGFuZCBjaGVjayBiaXQgMTUuICBUaGlzIGJpdCBpcyBhIDEgd2hlbiB0aGUgY2hlY2tzdW0KKyAgICAgICAgICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gZml4ZWQuICBJZiB0aGUgY2hlY2tzdW0gaXMgc3RpbGwgd3JvbmcgYW5kIHRoaXMKKyAgICAgICAgICAgICAqIGJpdCBpcyBhIDEsIHdlIG5lZWQgdG8gcmV0dXJuIGJhZCBjaGVja3N1bS4gIE90aGVyd2lzZSwgd2UgbmVlZAorICAgICAgICAgICAgICogdG8gc2V0IHRoaXMgYml0IHRvIGEgMSBhbmQgdXBkYXRlIHRoZSBjaGVja3N1bS4gKi8KKyAgICAgICAgICAgIGUxMDAwX3JlYWRfZWVwcm9tKGh3LCAweDIzLCAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICAgICAgaWYgKChlZXByb21fZGF0YSAmIDB4ODAwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGVlcHJvbV9kYXRhIHw9IDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlMTAwMF93cml0ZV9lZXByb20oaHcsIDB4MjMsIDEsICZlZXByb21fZGF0YSk7CisgICAgICAgICAgICAgICAgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShodyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBmb3IoaSA9IDA7IGkgPCAoRUVQUk9NX0NIRUNLU1VNX1JFRyArIDEpOyBpKyspIHsKICAgICAgICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CiAgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOwpAQCAtMzYyOCw2ICs0MDE4LDggQEAKICAgICBpZihlMTAwMF93cml0ZV9lZXByb20oaHcsIEVFUFJPTV9DSEVDS1NVTV9SRUcsIDEsICZjaGVja3N1bSkgPCAwKSB7CiAgICAgICAgIERFQlVHT1VUKCJFRVBST00gV3JpdGUgRXJyb3JcbiIpOwogICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfSBlbHNlIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX2ZsYXNoKSB7CisgICAgICAgIGUxMDAwX2NvbW1pdF9zaGFkb3dfcmFtKGh3KTsKICAgICB9CiAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CkBAIC0zNjYzLDYgKzQwNTUsMTAgQEAKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogICAgIH0KIAorICAgIC8qIDgyNTczIHJlYWRzIG9ubHkgdGhyb3VnaCBlZXJkICovCisgICAgaWYoZWVwcm9tLT51c2VfZWV3ciA9PSBUUlVFKQorICAgICAgICByZXR1cm4gZTEwMDBfd3JpdGVfZWVwcm9tX2Vld3IoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCiAgICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciB3cml0aW5nICAqLwogICAgIGlmIChlMTAwMF9hY3F1aXJlX2VlcHJvbShodykgIT0gRTEwMDBfU1VDQ0VTUykKICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwpAQCAtMzgzMyw2ICs0MjI5LDY1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZsdXNoZXMgdGhlIGNhY2hlZCBlZXByb20gdG8gTlZNLiBUaGlzIGlzIGRvbmUgYnkgc2F2aW5nIHRoZSBtb2RpZmllZCB2YWx1ZXMKKyAqIGluIHRoZSBlZXByb20gY2FjaGUgYW5kIHRoZSBub24gbW9kaWZpZWQgdmFsdWVzIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIGJhbmsKKyAqIHRvIHRoZSBuZXcgYmFuay4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IG9mICB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAorICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2NvbW1pdF9zaGFkb3dfcmFtKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgYXR0ZW1wdHMgPSAxMDAwMDA7CisgICAgdWludDMyX3QgZWVjZCA9IDA7CisgICAgdWludDMyX3QgZmxvcCA9IDA7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgaW50MzJfdCBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICAvKiBUaGUgZmxvcCByZWdpc3RlciB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGZsYXNoIHR5cGUgaXMgU1RNICovCisgICAgZmxvcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBGTE9QKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBhdHRlbXB0czsgaSsrKSB7CisgICAgICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgICAgICAgICAgaWYgKChlZWNkICYgRTEwMDBfRUVDRF9GTFVQRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWRlbGF5KDUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPT0gYXR0ZW1wdHMpIHsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorCisJLyogSWYgU1RNIG9wY29kZSBsb2NhdGVkIGluIGJpdHMgMTU6OCBvZiBmbG9wLCByZXNldCBmaXJtd2FyZSAqLworICAgICAgICBpZiAoKGZsb3AgJiAweEZGMDApID09IEUxMDAwX1NUTV9PUENPREUpIHsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSElDUiwgRTEwMDBfSElDUl9GV19SRVNFVCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBQZXJmb3JtIHRoZSBmbGFzaCB1cGRhdGUgKi8KKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkIHwgRTEwMDBfRUVDRF9GTFVQRCk7CisKKwlmb3IgKGk9MDsgaSA8IGF0dGVtcHRzOyBpKyspIHsKKyAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgICAgICAgICBpZiAoKGVlY2QgJiBFMTAwMF9FRUNEX0ZMVVBEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ZGVsYXkoNSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PSBhdHRlbXB0cykgeworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWFkcyB0aGUgYWRhcHRlcidzIHBhcnQgbnVtYmVyIGZyb20gdGhlIEVFUFJPTQogICoKICAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCkBAIC0zOTExLDYgKzQzNjYsNyBAQAogZTEwMDBfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgcmFyX251bTsKIAogICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9yeF9hZGRycyIpOwogCkBAIC0zOTE5LDkgKzQzNzUsMTAgQEAKIAogICAgIGUxMDAwX3Jhcl9zZXQoaHcsIGh3LT5tYWNfYWRkciwgMCk7CiAKKyAgICByYXJfbnVtID0gRTEwMDBfUkFSX0VOVFJJRVM7CiAgICAgLyogWmVybyBvdXQgdGhlIG90aGVyIDE1IHJlY2VpdmUgYWRkcmVzc2VzLiAqLwogICAgIERFQlVHT1VUKCJDbGVhcmluZyBSQVJbMS0xNV1cbiIpOwotICAgIGZvcihpID0gMTsgaSA8IEUxMDAwX1JBUl9FTlRSSUVTOyBpKyspIHsKKyAgICBmb3IoaSA9IDE7IGkgPCByYXJfbnVtOyBpKyspIHsKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSksIDApOwogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGkgPDwgMSkgKyAxKSwgMCk7CiAgICAgfQpAQCAtMzk1MCw3ICs0NDA3LDkgQEAKIHsKICAgICB1aW50MzJfdCBoYXNoX3ZhbHVlOwogICAgIHVpbnQzMl90IGk7Ci0KKyAgICB1aW50MzJfdCBudW1fcmFyX2VudHJ5OworICAgIHVpbnQzMl90IG51bV9tdGFfZW50cnk7CisgICAgCiAgICAgREVCVUdGVU5DKCJlMTAwMF9tY19hZGRyX2xpc3RfdXBkYXRlIik7CiAKICAgICAvKiBTZXQgdGhlIG5ldyBudW1iZXIgb2YgTUMgYWRkcmVzc2VzIHRoYXQgd2UgYXJlIGJlaW5nIHJlcXVlc3RlZCB0byB1c2UuICovCkBAIC0zOTU4LDE0ICs0NDE3LDE2IEBACiAKICAgICAvKiBDbGVhciBSQVJbMS0xNV0gKi8KICAgICBERUJVR09VVCgiIENsZWFyaW5nIFJBUlsxLTE1XVxuIik7Ci0gICAgZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IEUxMDAwX1JBUl9FTlRSSUVTOyBpKyspIHsKKyAgICBudW1fcmFyX2VudHJ5ID0gRTEwMDBfUkFSX0VOVFJJRVM7CisgICAgZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IG51bV9yYXJfZW50cnk7IGkrKykgewogICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKICAgICB9CiAKICAgICAvKiBDbGVhciB0aGUgTVRBICovCiAgICAgREVCVUdPVVQoIiBDbGVhcmluZyBNVEFcbiIpOwotICAgIGZvcihpID0gMDsgaSA8IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOyBpKyspIHsKKyAgICBudW1fbXRhX2VudHJ5ID0gRTEwMDBfTlVNX01UQV9SRUdJU1RFUlM7CisgICAgZm9yKGkgPSAwOyBpIDwgbnVtX210YV9lbnRyeTsgaSsrKSB7CiAgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKICAgICB9CiAKQEAgLTM5ODksNyArNDQ1MCw3IEBACiAgICAgICAgIC8qIFBsYWNlIHRoaXMgbXVsdGljYXN0IGFkZHJlc3MgaW4gdGhlIFJBUiBpZiB0aGVyZSBpcyByb29tLCAqCiAgICAgICAgICAqIGVsc2UgcHV0IGl0IGluIHRoZSBNVEEKICAgICAgICAgICovCi0gICAgICAgIGlmKHJhcl91c2VkX2NvdW50IDwgRTEwMDBfUkFSX0VOVFJJRVMpIHsKKyAgICAgICAgaWYgKHJhcl91c2VkX2NvdW50IDwgbnVtX3Jhcl9lbnRyeSkgewogICAgICAgICAgICAgZTEwMDBfcmFyX3NldChodywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNfYWRkcl9saXN0ICsgKGkgKiAoRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhcl91c2VkX2NvdW50KTsKQEAgLTQwNDAsNiArNDUwMSw3IEBACiAgICAgfQogCiAgICAgaGFzaF92YWx1ZSAmPSAweEZGRjsKKwogICAgIHJldHVybiBoYXNoX3ZhbHVlOwogfQogCkBAIC00MTQ0LDEyICs0NjA2LDMzIEBACiBlMTAwMF9jbGVhcl92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHZmdGFfdmFsdWUgPSAwOworICAgIHVpbnQzMl90IHZmdGFfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCB2ZnRhX2JpdF9pbl9yZWcgPSAwOwogCi0gICAgZm9yKG9mZnNldCA9IDA7IG9mZnNldCA8IEUxMDAwX1ZMQU5fRklMVEVSX1RCTF9TSVpFOyBvZmZzZXQrKykKLSAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCBvZmZzZXQsIDApOworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKyAgICAgICAgaWYgKGh3LT5tbmdfY29va2llLnZsYW5faWQgIT0gMCkgeworICAgICAgICAgICAgLyogVGhlIFZGVEEgaXMgYSA0MDk2YiBiaXQtZmllbGQsIGVhY2ggaWRlbnRpZnlpbmcgYSBzaW5nbGUgVkxBTgorICAgICAgICAgICAgICogSUQuICBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgZGV0ZXJtaW5lIHdoaWNoIDMyYiBlbnRyeQorICAgICAgICAgICAgICogKGkuZS4gb2Zmc2V0KSBpbnRvIHRoZSBhcnJheSB3ZSB3YW50IHRvIHNldCB0aGUgVkxBTiBJRAorICAgICAgICAgICAgICogKGkuZS4gYml0KSBvZiB0aGUgbWFuYWdlYWJpbGl0eSB1bml0LiAqLworICAgICAgICAgICAgdmZ0YV9vZmZzZXQgPSAoaHctPm1uZ19jb29raWUudmxhbl9pZCA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfVkZUQV9FTlRSWV9TSElGVCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9WRlRBX0VOVFJZX01BU0s7CisgICAgICAgICAgICB2ZnRhX2JpdF9pbl9yZWcgPSAxIDw8IChody0+bW5nX2Nvb2tpZS52bGFuX2lkICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1ZGVEFfRU5UUllfQklUX1NISUZUX01BU0spOworICAgICAgICB9CisgICAgfQorICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKSB7CisgICAgICAgIC8qIElmIHRoZSBvZmZzZXQgd2Ugd2FudCB0byBjbGVhciBpcyB0aGUgc2FtZSBvZmZzZXQgb2YgdGhlCisgICAgICAgICAqIG1hbmFnZWFiaWxpdHkgVkxBTiBJRCwgdGhlbiBjbGVhciBhbGwgYml0cyBleGNlcHQgdGhhdCBvZiB0aGUKKyAgICAgICAgICogbWFuYWdlYWJpbGl0eSB1bml0ICovCisgICAgICAgIHZmdGFfdmFsdWUgPSAob2Zmc2V0ID09IHZmdGFfb2Zmc2V0KSA/IHZmdGFfYml0X2luX3JlZyA6IDA7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2ZnRhX3ZhbHVlKTsKKyAgICB9CiB9CiAKLXN0YXRpYyBpbnQzMl90CitpbnQzMl90CiBlMTAwMF9pZF9sZWRfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKiBodykKIHsKICAgICB1aW50MzJfdCBsZWRjdGw7CkBAIC00NDgwLDYgKzQ5NjMsMTkgQEAKICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1HVFBSQyk7CiAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNR1RQREMpOwogICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTUdUUFRDKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikgcmV0dXJuOworCisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWE9DKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhQVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWEFUQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUFRDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhBVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFFFQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUU1UQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYRE1UQyk7CisKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDY0Niw2ICs1MTQyLDExIEBACiAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfdW5rbm93bjsKICAgICAgICAgaHctPmJ1c193aWR0aCA9IGUxMDAwX2J1c193aWR0aF91bmtub3duOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTczOgorICAgICAgICBody0+YnVzX3R5cGUgPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzczsKKyAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF8yNTAwOworICAgICAgICBody0+YnVzX3dpZHRoID0gZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzQ7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOwogICAgICAgICBody0+YnVzX3R5cGUgPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1BDSVhfTU9ERSkgPwpAQCAtNDc0OSw2ICs1MjUwLDcgQEAKIAogICAgIC8qIFVzZSBvbGQgbWV0aG9kIGZvciBQaHkgb2xkZXIgdGhhbiBJR1AgKi8KICAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwogICAgICAgICBpZihyZXRfdmFsKQpAQCAtNDg2NSw3ICs1MzY3LDggQEAKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogICAgICAgICAqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWSkgPj4KICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFlfU0hJRlQ7Ci0gICAgfSBlbHNlIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgfSBlbHNlIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8CisgICAgICAgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpIHsKICAgICAgICAgLyogUmVhZCB0aGUgU3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSBzcGVlZCAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX1NUQVRVUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwpAQCAtNDkxNyw3ICs1NDIwLDggQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfZG93bnNoaWZ0Iik7CiAKLSAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8IAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CiAgICAgICAgIGlmKHJldF92YWwpCkBAIC00OTMzLDYgKzU0MzcsNyBAQAogICAgICAgICBody0+c3BlZWRfZG93bmdyYWRlZCA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUKSA+PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUX1NISUZUOwogICAgIH0KKwogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCkBAIC01MDQ3LDcgKzU1NTIsNyBAQAogICAgICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CisgICAgICAgICAgICBtc2VjX2RlbGF5X2lycSgyMCk7CiAKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSk7CkBAIC01MDcxLDcgKzU1NzYsNyBAQAogICAgICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CisgICAgICAgICAgICBtc2VjX2RlbGF5X2lycSgyMCk7CiAKICAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CkBAIC01MDk2LDcgKzU2MDEsNyBAQAogICAgICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CisgICAgICAgICAgICBtc2VjX2RlbGF5X2lycSgyMCk7CiAKICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSk7CkBAIC01MTEyLDcgKzU2MTcsNyBAQAogICAgICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CisgICAgICAgICAgICBtc2VjX2RlbGF5X2lycSgyMCk7CiAKICAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCiAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CkBAIC01MTg3LDIyICs1NjkyLDM2IEBACiAgICAgdWludDE2X3QgcGh5X2RhdGE7CiAgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZSIpOwogCi0gICAgaWYoISgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yKSB8fAotICAgICAgICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikpKQorICAgIGlmKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwICYmIGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwXzIpCiAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogCiAgICAgLyogRHVyaW5nIGRyaXZlciBhY3Rpdml0eSBMUExVIHNob3VsZCBub3QgYmUgdXNlZCBvciBpdCB3aWxsIGF0dGFpbiBsaW5rCiAgICAgICogZnJvbSB0aGUgbG93ZXN0IHNwZWVkcyBzdGFydGluZyBmcm9tIDEwTWJwcy4gVGhlIGNhcGFiaWxpdHkgaXMgdXNlZCBmb3IKICAgICAgKiBEeCB0cmFuc2l0aW9ucyBhbmQgc3RhdGVzICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sICZwaHlfZGF0YSk7Ci0gICAgaWYocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICBpZighYWN0aXZlKSB7Ci0gICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgcGh5X2RhdGEpOworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sICZwaHlfZGF0YSk7CiAgICAgICAgIGlmKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgaWYoIWFjdGl2ZSkgeworICAgICAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKKyAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMkUxMDAwX1BNX0QzX0xQTFU7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQogCiAgICAgICAgIC8qIExQTFUgYW5kIFNtYXJ0U3BlZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIExQTFUgaXMgdXNlZCBkdXJpbmcKICAgICAgICAgICogRHggc3RhdGVzIHdoZXJlIHRoZSBwb3dlciBjb25zZXJ2YXRpb24gaXMgbW9zdCBpbXBvcnRhbnQuICBEdXJpbmcKQEAgLTUyMzYsMTEgKzU3NTUsMTA1IEBACiAgICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwX0FMTCApIHx8CiAgICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwpKSB7CiAKLSAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sIHBoeV9kYXRhKTsKKyAgICAgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAyRTEwMDBfUE1fRDNfTFBMVTsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgLyogV2hlbiBMUExVIGlzIGVuYWJsZWQgd2Ugc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgJnBoeV9kYXRhKTsKICAgICAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwogCisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGxwbHUgZDAgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBhY3RpdmUgZmxhZy4gIFdoZW4KKyAqIGFjdGl2YXRpbmcgbHBsdSB0aGlzIGZ1bmN0aW9uIGFsc28gZGlzYWJsZXMgc21hcnQgc3BlZWQgYW5kIHZpc2UgdmVyc2EuCisgKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50CisgKiBtZWV0cyBzdGFuZGFyZHMgb2YgZWl0aGVyIDEwIG9yIDEwLzEwMCBvciAxMC8xMDAvMTAwMCBhdCBhbGwgZHVwbGV4ZXMuCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBhY3RpdmUgLSB0cnVlIHRvIGVuYWJsZSBscGx1IGZhbHNlIHRvIGRpc2FibGUgbHBsdS4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50MzJfdAorZTEwMDBfc2V0X2QwX2xwbHVfc3RhdGUoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBhY3RpdmUpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X2QwX2xwbHVfc3RhdGUiKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMkUxMDAwX1BNX0QwX0xQTFU7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZworICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZworICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcworICAgICAgICAgKiBtYWludGFpbmVkLiAqLworICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgaWYgKGh3LT5zbWFydF9zcGVlZCA9PSBlMTAwMF9zbWFydF9zcGVlZF9vZmYpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworCSAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKworICAgIH0gZWxzZSB7CisgCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMkUxMDAwX1BNX0QwX0xQTFU7ICAgCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKICAgICAgICAgLyogV2hlbiBMUExVIGlzIGVuYWJsZWQgd2Ugc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCAqLwogICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgJnBoeV9kYXRhKTsKICAgICAgICAgaWYocmV0X3ZhbCkKQEAgLTUzMTgsNiArNTkzMSwzMzggQEAKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGNvb2tpZSBmcm9tIEFSQyByYW0uCisgKgorICogcmV0dXJuczogLSBFMTAwMF9TVUNDRVNTIC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfaG9zdF9pZl9yZWFkX2Nvb2tpZShzdHJ1Y3QgZTEwMDBfaHcgKiBodywgdWludDhfdCAqYnVmZmVyKQoreworICAgIHVpbnQ4X3QgaTsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBFMTAwMF9NTkdfREhDUF9DT09LSUVfT0ZGU0VUOyAKKyAgICB1aW50OF90IGxlbmd0aCA9IEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEg7CisKKyAgICBsZW5ndGggPSAobGVuZ3RoID4+IDIpOworICAgIG9mZnNldCA9IChvZmZzZXQgPj4gMik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgKigodWludDMyX3QgKikgYnVmZmVyICsgaSkgPQorICAgICAgICAgICAgRTEwMDBfUkVBRF9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGkpOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIEhPU1QgSUYgaXMgZW5hYmxlZCBmb3IgY29tbWFuZCBvcGVyYXRvbgorICogYW5kIGFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgY29tcGxldGVkLgorICogSXQgYnVzeSB3YWl0cyBpbiBjYXNlIG9mIHByZXZpb3VzIGNvbW1hbmQgaXMgbm90IGNvbXBsZXRlZC4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9IT1NUX0lOVEVSRkFDRV9DT01NQU5EIGluIGNhc2UgaWYgaXMgbm90IHJlYWR5IG9yIAorICogICAgICAgICAgICB0aW1lb3V0CisgKiAgICAgICAgICAtIEUxMDAwX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX21uZ19lbmFibGVfaG9zdF9pZihzdHJ1Y3QgZTEwMDBfaHcgKiBodykKK3sKKyAgICB1aW50MzJfdCBoaWNyOworICAgIHVpbnQ4X3QgaTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIGhvc3QgaW50ZXJmYWNlIGlzIGVuYWJsZWQuICovCisgICAgaGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBISUNSKTsKKyAgICBpZiAoKGhpY3IgJiBFMTAwMF9ISUNSX0VOKSA9PSAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFMTAwMF9IT1NUX0VOIGJpdCBkaXNhYmxlZC5cbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9IT1NUX0lOVEVSRkFDRV9DT01NQU5EOworICAgIH0KKyAgICAvKiBjaGVjayB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBjb21wbGV0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTU5HX0RIQ1BfQ09NTUFORF9USU1FT1VUOyBpKyspIHsKKyAgICAgICAgaGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBISUNSKTsKKyAgICAgICAgaWYgKCEoaGljciAmIEUxMDAwX0hJQ1JfQykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbXNlY19kZWxheV9pcnEoMSk7CisgICAgfQorCisgICAgaWYgKGkgPT0gRTEwMDBfTU5HX0RIQ1BfQ09NTUFORF9USU1FT1VUKSB7IAorICAgICAgICBERUJVR09VVCgiUHJldmlvdXMgY29tbWFuZCB0aW1lb3V0IGZhaWxlZCAuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGJ1ZmZlciBjb250ZW50IGF0IHRoZSBvZmZzZXQgZ2l2ZW4gb24gdGhlIGhvc3QgaWYuCisgKiBJdCBhbHNvIGRvZXMgYWxpZ25tZW50IGNvbnNpZGVyYXRpb25zIHRvIGRvIHRoZSB3cml0ZXMgaW4gbW9zdCBlZmZpY2llbnQgd2F5LgorICogQWxzbyBmaWxscyB1cCB0aGUgc3VtIG9mIHRoZSBidWZmZXIgaW4gKmJ1ZmZlciBwYXJhbWV0ZXIuCisgKgorICogcmV0dXJucyAgLSBFMTAwMF9TVUNDRVNTIGZvciBzdWNjZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9tbmdfaG9zdF9pZl93cml0ZShzdHJ1Y3QgZTEwMDBfaHcgKiBodywgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgKnN1bSkKK3sKKyAgICB1aW50OF90ICp0bXA7CisgICAgdWludDhfdCAqYnVmcHRyID0gYnVmZmVyOworICAgIHVpbnQzMl90IGRhdGE7CisgICAgdWludDE2X3QgcmVtYWluaW5nLCBpLCBqLCBwcmV2X2J5dGVzOworCisgICAgLyogc3VtID0gb25seSBzdW0gb2YgdGhlIGRhdGEgYW5kIGl0IGlzIG5vdCBjaGVja3N1bSAqLworCisgICAgaWYgKGxlbmd0aCA9PSAwIHx8IG9mZnNldCArIGxlbmd0aCA+IEUxMDAwX0hJX01BWF9NTkdfREFUQV9MRU5HVEgpIHsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07CisgICAgfQorCisgICAgdG1wID0gKHVpbnQ4X3QgKikmZGF0YTsKKyAgICBwcmV2X2J5dGVzID0gb2Zmc2V0ICYgMHgzOworICAgIG9mZnNldCAmPSAweEZGRkM7CisgICAgb2Zmc2V0ID4+PSAyOworCisgICAgaWYgKHByZXZfYnl0ZXMpIHsKKyAgICAgICAgZGF0YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZX0RXT1JEKGh3LCBIT1NUX0lGLCBvZmZzZXQpOworICAgICAgICBmb3IgKGogPSBwcmV2X2J5dGVzOyBqIDwgc2l6ZW9mKHVpbnQzMl90KTsgaisrKSB7CisgICAgICAgICAgICAqKHRtcCArIGopID0gKmJ1ZnB0cisrOworICAgICAgICAgICAgKnN1bSArPSAqKHRtcCArIGopOworICAgICAgICB9CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9EV09SRChodywgSE9TVF9JRiwgb2Zmc2V0LCBkYXRhKTsKKyAgICAgICAgbGVuZ3RoIC09IGogLSBwcmV2X2J5dGVzOworICAgICAgICBvZmZzZXQrKzsKKyAgICB9CisKKyAgICByZW1haW5pbmcgPSBsZW5ndGggJiAweDM7CisgICAgbGVuZ3RoIC09IHJlbWFpbmluZzsKKworICAgIC8qIENhbGN1bGF0ZSBsZW5ndGggaW4gRFdPUkRzICovCisgICAgbGVuZ3RoID4+PSAyOworCisgICAgLyogVGhlIGRldmljZSBkcml2ZXIgd3JpdGVzIHRoZSByZWxldmFudCBjb21tYW5kIGJsb2NrIGludG8gdGhlCisgICAgICogcmFtIGFyZWEuICovCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YodWludDMyX3QpOyBqKyspIHsKKyAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7CisgICAgICAgICAgICAqc3VtICs9ICoodG1wICsgaik7CisgICAgICAgIH0KKworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGksIGRhdGEpOworICAgIH0KKyAgICBpZiAocmVtYWluaW5nKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YodWludDMyX3QpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChqIDwgcmVtYWluaW5nKQorICAgICAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKih0bXAgKyBqKSA9IDA7CisKKyAgICAgICAgICAgICpzdW0gKz0gKih0bXAgKyBqKTsKKyAgICAgICAgfQorICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGksIGRhdGEpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGNvbW1hbmQgaGVhZGVyIGFmdGVyIGRvZXMgdGhlIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorICoKKyAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfbW5nX3dyaXRlX2NtZF9oZWFkZXIoc3RydWN0IGUxMDAwX2h3ICogaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIgKiBoZHIpCit7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50OF90IHN1bTsKKyAgICB1aW50OF90ICpidWZmZXI7CisKKyAgICAvKiBXcml0ZSB0aGUgd2hvbGUgY29tbWFuZCBoZWFkZXIgc3RydWN0dXJlIHdoaWNoIGluY2x1ZGVzIHN1bSBvZgorICAgICAqIHRoZSBidWZmZXIgKi8KKworICAgIHVpbnQxNl90IGxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIpOworCisgICAgc3VtID0gaGRyLT5jaGVja3N1bTsKKyAgICBoZHItPmNoZWNrc3VtID0gMDsKKworICAgIGJ1ZmZlciA9ICh1aW50OF90ICopIGhkcjsKKyAgICBpID0gbGVuZ3RoOworICAgIHdoaWxlKGktLSkKKyAgICAgICAgc3VtICs9IGJ1ZmZlcltpXTsKKworICAgIGhkci0+Y2hlY2tzdW0gPSAwIC0gc3VtOworCisgICAgbGVuZ3RoID4+PSAyOworICAgIC8qIFRoZSBkZXZpY2UgZHJpdmVyIHdyaXRlcyB0aGUgcmVsZXZhbnQgY29tbWFuZCBibG9jayBpbnRvIHRoZSByYW0gYXJlYS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9EV09SRChodywgSE9TVF9JRiwgaSwgKigodWludDMyX3QgKikgaGRyICsgaSkpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB0byBBUkMgdGhhdCBhIG5ldyBjb21tYW5kIGlzIHBlbmRpbmcgd2hpY2ggY29tcGxldGVzCisgKiBvbmUgd3JpdGUgb3BlcmF0aW9uIGJ5IHRoZSBkcml2ZXIuCisgKgorICogcmV0dXJucyAgLSBFMTAwMF9TVUNDRVNTIGZvciBzdWNjZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9tbmdfd3JpdGVfY29tbWl0KAorICAgIHN0cnVjdCBlMTAwMF9odyAqIGh3KQoreworICAgIHVpbnQzMl90IGhpY3I7CisKKyAgICBoaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIEhJQ1IpOworICAgIC8qIFNldHRpbmcgdGhpcyBiaXQgdGVsbHMgdGhlIEFSQyB0aGF0IGEgbmV3IGNvbW1hbmQgaXMgcGVuZGluZy4gKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEhJQ1IsIGhpY3IgfCBFMTAwMF9ISUNSX0MpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgbW9kZSBvZiB0aGUgZmlybXdhcmUuCisgKgorICogcmV0dXJucyAgLSBUUlVFIHdoZW4gdGhlIG1vZGUgaXMgSUFNVCBvciBGQUxTRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbGVhbl90CitlMTAwMF9jaGVja19tbmdfbW9kZSgKKyAgICBzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGZ3c207CisKKyAgICBmd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZXU00pOworCisgICAgaWYoKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPT0KKyAgICAgICAgKEUxMDAwX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKSkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZGhjcCBpbmZvIC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfbW5nX3dyaXRlX2RoY3BfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKiBodywgdWludDhfdCAqYnVmZmVyLAorCQkJICB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHN0cnVjdCBlMTAwMF9ob3N0X21uZ19jb21tYW5kX2hlYWRlciBoZHI7CisKKyAgICBoZHIuY29tbWFuZF9pZCA9IEUxMDAwX01OR19ESENQX1RYX1BBWUxPQURfQ01EOworICAgIGhkci5jb21tYW5kX2xlbmd0aCA9IGxlbmd0aDsKKyAgICBoZHIucmVzZXJ2ZWQxID0gMDsKKyAgICBoZHIucmVzZXJ2ZWQyID0gMDsKKyAgICBoZHIuY2hlY2tzdW0gPSAwOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX21uZ19lbmFibGVfaG9zdF9pZihodyk7CisgICAgaWYgKHJldF92YWwgPT0gRTEwMDBfU1VDQ0VTUykgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX2hvc3RfaWZfd3JpdGUoaHcsIGJ1ZmZlciwgbGVuZ3RoLCBzaXplb2YoaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaGRyLmNoZWNrc3VtKSk7CisgICAgICAgIGlmIChyZXRfdmFsID09IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9tbmdfd3JpdGVfY21kX2hlYWRlcihodywgJmhkcik7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9tbmdfd3JpdGVfY29tbWl0KGh3KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY2hlY2tzdW0uCisgKgorICogcmV0dXJucyAgLSBjaGVja3N1bSBvZiBidWZmZXIgY29udGVudHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQ4X3QKK2UxMDAwX2NhbGN1bGF0ZV9tbmdfY2hlY2tzdW0oY2hhciAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDhfdCBzdW0gPSAwOworICAgIHVpbnQzMl90IGk7CisKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGk9MDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBzdW0gKz0gYnVmZmVyW2ldOworCisgICAgcmV0dXJuICh1aW50OF90KSAoMCAtIHN1bSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0eCBwa3QgZmlsdGVyaW5nIG5lZWRzIHRvIGJlIGVuYWJsZWQgb3Igbm90LgorICoKKyAqIHJldHVybnMgIC0gVFJVRSBmb3IgcGFja2V0IGZpbHRlcmluZyBvciBGQUxTRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbGVhbl90CitlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIC8qIGNhbGxlZCBpbiBpbml0IGFzIHdlbGwgYXMgd2F0Y2hkb2cgdGltZXIgZnVuY3Rpb25zICovCisKKyAgICBpbnQzMl90IHJldF92YWwsIGNoZWNrc3VtOworICAgIGJvb2xlYW5fdCB0eF9maWx0ZXIgPSBGQUxTRTsKKyAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWUgKmhkciA9ICYoaHctPm1uZ19jb29raWUpOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9ICh1aW50OF90ICopICYoaHctPm1uZ19jb29raWUpOworCisgICAgaWYgKGUxMDAwX2NoZWNrX21uZ19tb2RlKGh3KSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX2VuYWJsZV9ob3N0X2lmKGh3KTsKKyAgICAgICAgaWYgKHJldF92YWwgPT0gRTEwMDBfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoaHcsIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSBoZHItPmNoZWNrc3VtOworICAgICAgICAgICAgICAgIGhkci0+Y2hlY2tzdW0gPSAwOworICAgICAgICAgICAgICAgIGlmICgoaGRyLT5zaWduYXR1cmUgPT0gRTEwMDBfSUFNVF9TSUdOQVRVUkUpICYmCisgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtID09IGUxMDAwX2NhbGN1bGF0ZV9tbmdfY2hlY2tzdW0oKGNoYXIgKilidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZHItPnN0YXR1cyAmCisgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1BBUlNJTkdfU1VQUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4X2ZpbHRlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR4X2ZpbHRlciA9IFRSVUU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0eF9maWx0ZXIgPSBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgaHctPnR4X3BrdF9maWx0ZXJpbmcgPSB0eF9maWx0ZXI7CisgICAgcmV0dXJuIHR4X2ZpbHRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmVyaWZpZXMgdGhlIGhhcmR3YXJlIG5lZWRzIHRvIGFsbG93IEFSUHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBob3N0CisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiByZXR1cm5zOiAtIFRSVUUvRkFMU0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdAorZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBtYW5jOworICAgIHVpbnQzMl90IGZ3c20sIGZhY3RwczsKKworICAgIGlmIChody0+YXNmX2Zpcm13YXJlX3ByZXNlbnQpIHsKKyAgICAgICAgbWFuYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKKworICAgICAgICBpZiAoIShtYW5jICYgRTEwMDBfTUFOQ19SQ1ZfVENPX0VOKSB8fAorICAgICAgICAgICAgIShtYW5jICYgRTEwMDBfTUFOQ19FTl9NQUNfQUREUl9GSUxURVIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoZTEwMDBfYXJjX3N1YnN5c3RlbV92YWxpZChodykgPT0gVFJVRSkgeworICAgICAgICAgICAgZndzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBGV1NNKTsKKyAgICAgICAgICAgIGZhY3RwcyA9IEUxMDAwX1JFQURfUkVHKGh3LCBGQUNUUFMpOworCisgICAgICAgICAgICBpZiAoKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spID09CisgICAgICAgICAgICAgICAgKGUxMDAwX21uZ19tb2RlX3B0IDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkpICYmCisgICAgICAgICAgICAgICAgKGZhY3RwcyAmIEUxMDAwX0ZBQ1RQU19NTkdDRykpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaWYgKChtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgJiYgIShtYW5jICYgRTEwMDBfTUFOQ19BU0ZfRU4pKQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKIHN0YXRpYyBpbnQzMl90CiBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CkBAIC01NDAzLDMgKzYzNDgsMjY1IEBACiAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEaXNhYmxlcyBQQ0ktRXhwcmVzcyBtYXN0ZXIgYWNjZXNzLgorICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiByZXR1cm5zOiAtIG5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZSIpOworCisgICAgaWYgKGh3LT5idXNfdHlwZSAhPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBjdHJsIHw9IEUxMDAwX0NUUkxfR0lPX01BU1RFUl9ESVNBQkxFOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFbmFibGVzIFBDSS1FeHByZXNzIG1hc3RlciBhY2Nlc3MuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gbm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfZW5hYmxlX3BjaWV4X21hc3RlcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2VuYWJsZV9wY2lleF9tYXN0ZXIiKTsKKworICAgIGlmIChody0+YnVzX3R5cGUgIT0gZTEwMDBfYnVzX3R5cGVfcGNpX2V4cHJlc3MpCisgICAgICAgIHJldHVybjsKKworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9HSU9fTUFTVEVSX0RJU0FCTEU7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEaXNhYmxlcyBQQ0ktRXhwcmVzcyBtYXN0ZXIgYWNjZXNzIGFuZCB2ZXJpZmllcyB0aGVyZSBhcmUgbm8gcGVuZGluZyByZXF1ZXN0cworICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9NQVNURVJfUkVRVUVTVFNfUEVORElORyBpZiBtYXN0ZXIgZGlzYWJsZSBiaXQgaGFzbid0CisgKiAgICAgICAgICAgIGNhdXNlZCB0aGUgbWFzdGVyIHJlcXVlc3RzIHRvIGJlIGRpc2FibGVkLgorICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIG1hc3RlciByZXF1ZXN0cyBkaXNhYmxlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHRpbWVvdXQgPSBNQVNURVJfRElTQUJMRV9USU1FT1VUOyAgIC8qIDgwbXMgKi8KKworICAgIERFQlVHRlVOQygiZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIiKTsKKworICAgIGlmIChody0+YnVzX3R5cGUgIT0gZTEwMDBfYnVzX3R5cGVfcGNpX2V4cHJlc3MpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgZTEwMDBfc2V0X3BjaV9leHByZXNzX21hc3Rlcl9kaXNhYmxlKGh3KTsKKworICAgIHdoaWxlKHRpbWVvdXQpIHsKKyAgICAgICAgaWYoIShFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19HSU9fTUFTVEVSX0VOQUJMRSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdWRlbGF5KDEwMCk7CisgICAgICAgIHRpbWVvdXQtLTsKKyAgICB9CisKKyAgICBpZighdGltZW91dCkgeworICAgICAgICBERUJVR09VVCgiTWFzdGVyIHJlcXVlc3RzIGFyZSBwZW5kaW5nLlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX01BU1RFUl9SRVFVRVNUU19QRU5ESU5HOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoZWNrIGZvciBFRVBST00gQXV0byBSZWFkIGJpdCBkb25lLgorICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9SRVNFVCBpZiBmYWlsIHRvIHJlc2V0IE1BQworICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIGF0IGFueSBvdGhlciBjYXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9nZXRfYXV0b19yZF9kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCB0aW1lb3V0ID0gQVVUT19SRUFEX0RPTkVfVElNRU9VVDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZSIpOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICBtc2VjX2RlbGF5KDUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTczOgorICAgICAgICB3aGlsZSh0aW1lb3V0KSB7CisgICAgICAgICAgICBpZiAoRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpICYgRTEwMDBfRUVDRF9BVVRPX1JEKSBicmVhazsKKyAgICAgICAgICAgIGVsc2UgbXNlY19kZWxheSgxKTsKKyAgICAgICAgICAgIHRpbWVvdXQtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCF0aW1lb3V0KSB7CisgICAgICAgICAgICBERUJVR09VVCgiQXV0byByZWFkIGJ5IEhXIGZyb20gRUVQUk9NIGhhcyBub3QgY29tcGxldGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9SRVNFVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2tzIGlmIHRoZSBQSFkgY29uZmlndXJhdGlvbiBpcyBkb25lCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX1JFU0VUIGlmIGZhaWwgdG8gcmVzZXQgTUFDCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2dldF9waHlfY2ZnX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9waHlfY2ZnX2RvbmUiKTsKKworICAgIC8qIFNpbXBseSB3YWl0IGZvciAxMG1zICovCisgICAgbXNlY19kZWxheSgxMCk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVzaW5nIHRoZSBjb21iaW5hdGlvbiBvZiBTTUJJIGFuZCBTV0VTTUJJIHNlbWFwaG9yZSBiaXRzIHdoZW4gcmVzZXR0aW5nCisgKiBhZGFwdGVyIG9yIEVlcHJvbSBhY2Nlc3MuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX0VFUFJPTSBpZiBmYWlsIHRvIGFjY2VzcyBFRVBST00uCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCB0aW1lb3V0OworICAgIHVpbnQzMl90IHN3c207CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlIik7CisKKyAgICBpZighaHctPmVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudCkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKworICAgIC8qIEdldCB0aGUgRlcgc2VtYXBob3JlLiAqLworICAgIHRpbWVvdXQgPSBody0+ZWVwcm9tLndvcmRfc2l6ZSArIDE7CisgICAgd2hpbGUodGltZW91dCkgeworICAgICAgICBzd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNXU00pOworICAgICAgICBzd3NtIHw9IEUxMDAwX1NXU01fU1dFU01CSTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTV1NNLCBzd3NtKTsKKyAgICAgICAgLyogaWYgd2UgbWFuYWdlZCB0byBzZXQgdGhlIGJpdCB3ZSBnb3QgdGhlIHNlbWFwaG9yZS4gKi8KKyAgICAgICAgc3dzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV1NNKTsKKyAgICAgICAgaWYoc3dzbSAmIEUxMDAwX1NXU01fU1dFU01CSSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHVkZWxheSg1MCk7CisgICAgICAgIHRpbWVvdXQtLTsKKyAgICB9CisKKyAgICBpZighdGltZW91dCkgeworICAgICAgICAvKiBSZWxlYXNlIHNlbWFwaG9yZXMgKi8KKyAgICAgICAgZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOworICAgICAgICBERUJVR09VVCgiRHJpdmVyIGNhbid0IGFjY2VzcyB0aGUgRWVwcm9tIC0gU1dFU01CSSBiaXQgaXMgc2V0LlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgSFcgc2VtYXBob3JlIGJpdHMuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBzd3NtOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZSIpOworCisgICAgaWYoIWh3LT5lZXByb21fc2VtYXBob3JlX3ByZXNlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIHN3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgU1dTTSk7CisgICAgLyogUmVsZWFzZSBib3RoIHNlbWFwaG9yZXMuICovCisgICAgc3dzbSAmPSB+KEUxMDAwX1NXU01fU01CSSB8IEUxMDAwX1NXU01fU1dFU01CSSk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTV1NNLCBzd3NtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2tzIGlmIFBIWSByZXNldCBpcyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLCBmb3IgZXhhbXBsZS4KKyAqIFJldHVybmluZyBFMTAwMF9CTEtfUEhZX1JFU0VUIGlzbid0IG5lY2Vzc2FyaWx5IGFuIGVycm9yLiAgQnV0IGl0J3MgdXAgdG8KKyAqIHRoZSBjYWxsZXIgdG8gZmlndXJlIG91dCBob3cgdG8gZGVhbCB3aXRoIGl0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9CTEtfUEhZX1JFU0VUCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBtYW5jID0gMDsKKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKKyAgICAgICAgbWFuYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKKyAgICByZXR1cm4gKG1hbmMgJiBFMTAwMF9NQU5DX0JMS19QSFlfUlNUX09OX0lERSkgPworCSAgICBFMTAwMF9CTEtfUEhZX1JFU0VUIDogRTEwMDBfU1VDQ0VTUzsKK30KKwordWludDhfdAorZTEwMDBfYXJjX3N1YnN5c3RlbV92YWxpZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGZ3c207CisKKyAgICAvKiBPbiA4MjU3eCBzaWxpY29uLCByZWdpc3RlcnMgaW4gdGhlIHJhbmdlIG9mIDB4ODgwMCAtIDB4OEZGQworICAgICAqIG1heSBub3QgYmUgcHJvdmlkZWQgYSBETUEgY2xvY2sgd2hlbiBubyBtYW5hZ2VhYmlsaXR5IGZlYXR1cmVzIGFyZQorICAgICAqIGVuYWJsZWQuICBXZSBkbyBub3Qgd2FudCB0byBwZXJmb3JtIGFueSByZWFkcy93cml0ZXMgdG8gdGhlc2UgcmVnaXN0ZXJzCisgICAgICogaWYgdGhpcyBpcyB0aGUgY2FzZS4gIFdlIHJlYWQgRldTTSB0byBkZXRlcm1pbmUgdGhlIG1hbmFnZWFiaWxpdHkgbW9kZS4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgIGZ3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgRldTTSk7CisgICAgICAgIGlmKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spICE9IDApCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCmluZGV4IGYzOTdlNjMuLmEwMjYzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIApAQCAtNTcsNiArNTcsNyBAQAogICAgIGUxMDAwXzgyNTQxX3Jldl8yLAogICAgIGUxMDAwXzgyNTQ3LAogICAgIGUxMDAwXzgyNTQ3X3Jldl8yLAorICAgIGUxMDAwXzgyNTczLAogICAgIGUxMDAwX251bV9tYWNzCiB9IGUxMDAwX21hY190eXBlOwogCkBAIC02NCw2ICs2NSw3IEBACiAgICAgZTEwMDBfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAogICAgIGUxMDAwX2VlcHJvbV9zcGksCiAgICAgZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKKyAgICBlMTAwMF9lZXByb21fZmxhc2gsCiAgICAgZTEwMDBfbnVtX2VlcHJvbV90eXBlcwogfSBlMTAwMF9lZXByb21fdHlwZTsKIApAQCAtOTYsNiArOTgsNyBAQAogICAgIGUxMDAwX2J1c190eXBlX3Vua25vd24gPSAwLAogICAgIGUxMDAwX2J1c190eXBlX3BjaSwKICAgICBlMTAwMF9idXNfdHlwZV9wY2l4LAorICAgIGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzLAogICAgIGUxMDAwX2J1c190eXBlX3Jlc2VydmVkCiB9IGUxMDAwX2J1c190eXBlOwogCkBAIC0xMDcsNiArMTEwLDcgQEAKICAgICBlMTAwMF9idXNfc3BlZWRfMTAwLAogICAgIGUxMDAwX2J1c19zcGVlZF8xMjAsCiAgICAgZTEwMDBfYnVzX3NwZWVkXzEzMywKKyAgICBlMTAwMF9idXNfc3BlZWRfMjUwMCwKICAgICBlMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQKIH0gZTEwMDBfYnVzX3NwZWVkOwogCkBAIC0xMTUsNiArMTE5LDggQEAKICAgICBlMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCiAgICAgZTEwMDBfYnVzX3dpZHRoXzMyLAogICAgIGUxMDAwX2J1c193aWR0aF82NCwKKyAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMSwKKyAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCwKICAgICBlMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKIH0gZTEwMDBfYnVzX3dpZHRoOwogCkBAIC0xOTYsNiArMjAyLDcgQEAKIHR5cGVkZWYgZW51bSB7CiAgICAgZTEwMDBfcGh5X204OCA9IDAsCiAgICAgZTEwMDBfcGh5X2lncCwKKyAgICBlMTAwMF9waHlfaWdwXzIsCiAgICAgZTEwMDBfcGh5X3VuZGVmaW5lZCA9IDB4RkYKIH0gZTEwMDBfcGh5X3R5cGU7CiAKQEAgLTI0Miw4ICsyNDksMTkgQEAKICAgICB1aW50MTZfdCBhZGRyZXNzX2JpdHM7CiAgICAgdWludDE2X3QgZGVsYXlfdXNlYzsKICAgICB1aW50MTZfdCBwYWdlX3NpemU7CisgICAgYm9vbGVhbl90IHVzZV9lZXJkOworICAgIGJvb2xlYW5fdCB1c2VfZWV3cjsKIH07CiAKKy8qIEZsZXggQVNGIEluZm9ybWF0aW9uICovCisjZGVmaW5lIEUxMDAwX0hPU1RfSUZfTUFYX1NJWkUgIDIwNDgKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9ieXRlX2FsaWduID0gMCwKKyAgICBlMTAwMF93b3JkX2FsaWduID0gMSwKKyAgICBlMTAwMF9kd29yZF9hbGlnbiA9IDIKK30gZTEwMDBfYWxpZ25fdHlwZTsKKwogCiAKIC8qIEVycm9yIENvZGVzICovCkBAIC0yNTQsMTEgKzI3MiwxNiBAQAogI2RlZmluZSBFMTAwMF9FUlJfUEFSQU0gICAgNAogI2RlZmluZSBFMTAwMF9FUlJfTUFDX1RZUEUgNQogI2RlZmluZSBFMTAwMF9FUlJfUEhZX1RZUEUgNgorI2RlZmluZSBFMTAwMF9FUlJfUkVTRVQgICA5CisjZGVmaW5lIEUxMDAwX0VSUl9NQVNURVJfUkVRVUVTVFNfUEVORElORyAxMAorI2RlZmluZSBFMTAwMF9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORCAxMQorI2RlZmluZSBFMTAwMF9CTEtfUEhZX1JFU0VUICAgMTIKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwogLyogSW5pdGlhbGl6YXRpb24gKi8KIGludDMyX3QgZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBpbnQzMl90IGUxMDAwX2luaXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2lkX2xlZF9pbml0KHN0cnVjdCBlMTAwMF9odyAqIGh3KTsKIGludDMyX3QgZTEwMDBfc2V0X21hY190eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogdm9pZCBlMTAwMF9zZXRfbWVkaWFfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIApAQCAtMjc1LDcgKzI5OCw3IEBACiAvKiBQSFkgKi8KIGludDMyX3QgZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCAqcGh5X2RhdGEpOwogaW50MzJfdCBlMTAwMF93cml0ZV9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCBkYXRhKTsKLXZvaWQgZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9waHlfaHdfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBpbnQzMl90IGUxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfZGV0ZWN0X2dpZ19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBpbnQzMl90IGUxMDAwX3BoeV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKQEAgLTI4NywxMyArMzEwLDg2IEBACiBpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiAvKiBFRVBST00gRnVuY3Rpb25zICovCi12b2lkIGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKHN0cnVjdCBlMTAwMF9odyAqaHcpOworYm9vbGVhbl90IGUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfcmVhZF9lZXByb21fZWVyZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBvZmZzZXQsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CitpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbV9lZXdyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK2ludDMyX3QgZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBpbnQgZWVyZCk7CisKKy8qIE1ORyBIT1NUIElGIGZ1bmN0aW9ucyAqLwordWludDMyX3QgZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfVFhfUEFZTE9BRF9DTUQgICA2NAorI2RlZmluZSBFMTAwMF9ISV9NQVhfTU5HX0RBVEFfTEVOR1RIICAgIDB4NkY4ICAgLyogSG9zdCBJbnRlcmZhY2UgZGF0YSBsZW5ndGggKi8KKworI2RlZmluZSBFMTAwMF9NTkdfREhDUF9DT01NQU5EX1RJTUVPVVQgIDEwICAgICAgLyogVGltZSBpbiBtcyB0byBwcm9jZXNzIE1ORyBjb21tYW5kICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9PRkZTRVQJMHg2RjAgICAvKiBDb29raWUgb2Zmc2V0ICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEgJMHgxMCAgICAvKiBDb29raWUgbGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX01OR19JQU1UX01PREUJCTB4MworI2RlZmluZSBFMTAwMF9JQU1UX1NJR05BVFVSRSAgICAgICAgICAgIDB4NTQ0RDQxNDkgLyogSW50ZWwoUikgQWN0aXZlIE1hbmFnZW1lbnQgVGVjaG5vbG9neSBzaWduYXR1cmUgKi8KKworI2RlZmluZSBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1BBUlNJTkdfU1VQUE9SVCAweDEgLyogREhDUCBwYXJzaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQgICAgMHgyIC8qIERIQ1AgcGFyc2luZyBlbmFibGVkICovCisjZGVmaW5lIEUxMDAwX1ZGVEFfRU5UUllfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBFMTAwMF9WRlRBX0VOVFJZX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lIEUxMDAwX1ZGVEFfRU5UUllfQklUX1NISUZUX01BU0sgICAgICAgICAgICAgIDB4MUYKKworc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaGVhZGVyIHsKKyAgICB1aW50OF90IGNvbW1hbmRfaWQ7CisgICAgdWludDhfdCBjaGVja3N1bTsKKyAgICB1aW50MTZfdCByZXNlcnZlZDE7CisgICAgdWludDE2X3QgcmVzZXJ2ZWQyOworICAgIHVpbnQxNl90IGNvbW1hbmRfbGVuZ3RoOworfTsKKworc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaW5mbyB7CisgICAgc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaGVhZGVyIGNvbW1hbmRfaGVhZGVyOyAgLyogQ29tbWFuZCBIZWFkL0NvbW1hbmQgUmVzdWx0IEhlYWQgaGFzIDQgYnl0ZXMgKi8KKyAgICB1aW50OF90IGNvbW1hbmRfZGF0YVtFMTAwMF9ISV9NQVhfTU5HX0RBVEFfTEVOR1RIXTsgICAvKiBDb21tYW5kIGRhdGEgY2FuIGxlbmd0aCAwLi4weDY1OCovCit9OworI2lmZGVmIF9fQklHX0VORElBTgorc3RydWN0IGUxMDAwX2hvc3RfbW5nX2RoY3BfY29va2lleworICAgIHVpbnQzMl90IHNpZ25hdHVyZTsKKyAgICB1aW50MTZfdCB2bGFuX2lkOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQwOworICAgIHVpbnQ4X3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgICB1aW50OF90IGNoZWNrc3VtOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQzOworICAgIHVpbnQxNl90IHJlc2VydmVkMjsKK307CisjZWxzZQorc3RydWN0IGUxMDAwX2hvc3RfbW5nX2RoY3BfY29va2lleworICAgIHVpbnQzMl90IHNpZ25hdHVyZTsKKyAgICB1aW50OF90IHN0YXR1czsKKyAgICB1aW50OF90IHJlc2VydmVkMDsKKyAgICB1aW50MTZfdCB2bGFuX2lkOworICAgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgICB1aW50MTZfdCByZXNlcnZlZDI7CisgICAgdWludDhfdCByZXNlcnZlZDM7CisgICAgdWludDhfdCBjaGVja3N1bTsKK307CisjZW5kaWYKKworaW50MzJfdCBlMTAwMF9tbmdfd3JpdGVfZGhjcF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKmJ1ZmZlciwgCisJCQkJCQkJdWludDE2X3QgbGVuZ3RoKTsKK2Jvb2xlYW5fdCBlMTAwMF9jaGVja19tbmdfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2Jvb2xlYW5fdCBlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfbW5nX2VuYWJsZV9ob3N0X2lmKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9tbmdfaG9zdF9pZl93cml0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgKnN1bSk7CitpbnQzMl90IGUxMDAwX21uZ193cml0ZV9jbWRfaGVhZGVyKHN0cnVjdCBlMTAwMF9odyogaHcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIqIGhkcik7CisKK2ludDMyX3QgZTEwMDBfbW5nX3dyaXRlX2NvbW1pdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKwogaW50MzJfdCBlMTAwMF9yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CiBpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IHJlZywgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKIGludDMyX3QgZTEwMDBfcmVhZF9wYXJ0X251bShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqIHBhcnRfbnVtKTsKIGludDMyX3QgZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKiBodyk7CitpbnQzMl90IGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG1hc2spOwordm9pZCBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBtYXNrKTsKIAogLyogRmlsdGVycyAobXVsdGljYXN0LCB2bGFuLCByZWNlaXZlKSAqLwogdm9pZCBlMTAwMF9pbml0X3J4X2FkZHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMzEzLDcgKzQwOSw2IEBACiAvKiBBZGFwdGl2ZSBJRlMgRnVuY3Rpb25zICovCiAKIC8qIEV2ZXJ5dGhpbmcgZWxzZSAqLwotdWludDMyX3QgZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoc3RydWN0IGUxMDAwX2h3ICpodyk7CiB2b2lkIGUxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogdm9pZCBlMTAwMF9yZXNldF9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHZvaWQgZTEwMDBfdXBkYXRlX2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMzMwLDYgKzQyNSwxOSBAQAogdm9pZCBlMTAwMF93cml0ZV9yZWdfaW8oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSk7CiBpbnQzMl90IGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbGVhbl90IGxpbmtfdXApOwogaW50MzJfdCBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sZWFuX3QgYWN0aXZlKTsKK2ludDMyX3QgZTEwMDBfc2V0X2QwX2xwbHVfc3RhdGUoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbGVhbl90IGFjdGl2ZSk7Cit2b2lkIGUxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfZW5hYmxlX3BjaWV4X21hc3RlcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2dldF9hdXRvX3JkX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2dldF9waHlfY2ZnX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2dldF9zb2Z0d2FyZV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX3JlbGVhc2Vfc29mdHdhcmVfc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfY29tbWl0X3NoYWRvd19yYW0oc3RydWN0IGUxMDAwX2h3ICpodyk7Cit1aW50OF90IGUxMDAwX2FyY19zdWJzeXN0ZW1fdmFsaWQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKICNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfSU8oYSwgcmVnKSBcCiAgICAgZTEwMDBfcmVhZF9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZykKQEAgLTM2OSw2ICs0NzcsMTAgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTICAgICAgMHgxMDdCCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1BDSUUgICAgICAgIDB4MTA4QQogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDdFSSAgICAgICAgICAgICAweDEwMTkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTczRSAgICAgICAgICAgICAgMHgxMDhCCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3M0VfSUFNVCAgICAgICAgIDB4MTA4QworCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSIDB4MTA5OQogCiAjZGVmaW5lIE5PREVfQUREUkVTU19TSVpFIDYKICNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTIDYKQEAgLTM4MSw2ICs0OTMsNyBAQAogI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8wICAgICAgIDAKICNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMSAgICAgICAxCiAjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzIgICAgICAgMgorI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8zICAgICAgIDMKIAogI2RlZmluZSBTUEVFRF8xMCAgICAxMAogI2RlZmluZSBTUEVFRF8xMDAgICAxMDAKQEAgLTQzNyw2ICs1NTAsNyBAQAogICAgIEUxMDAwX0lNU19SWFNFUSAgfCAgICBcCiAgICAgRTEwMDBfSU1TX0xTQykKIAorCiAvKiBOdW1iZXIgb2YgaGlnaC9sb3cgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIFJBUi4gVGhlIFJBUiAoUmVjZWl2ZSBBZGRyZXNzCiAgKiBSZWdpc3RlcnMpIGhvbGRzIHRoZSBkaXJlY3RlZCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcyB0aGF0IHdlIG1vbml0b3IuIFdlCiAgKiByZXNlcnZlIG9uZSBvZiB0aGVzZSBzcG90cyBmb3Igb3VyIGRpcmVjdGVkIGFkZHJlc3MsIGFsbG93aW5nIHVzIHJvb20gZm9yCkBAIC00NTcsMTQgKzU3MSw3NCBAQAogICAgIHVpbnQxNl90IHNwZWNpYWw7CiB9OwogCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgLSBFeHRlbmRlZCAqLwordW5pb24gZTEwMDBfcnhfZGVzY19leHRlbmRlZCB7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7CisgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkOworICAgIH0gcmVhZDsKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3QgbXJxOyAgICAgICAgICAgICAgLyogTXVsdGlwbGUgUnggUXVldWVzICovCisgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnNzOyAgICAgICAgICAvKiBSU1MgSGFzaCAqLworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlwX2lkOyAgICAvKiBJUCBpZCAqLworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjc3VtOyAgICAgLyogUGFja2V0IENoZWNrc3VtICovCisgICAgICAgICAgICAgICAgfSBjc3VtX2lwOworICAgICAgICAgICAgfSBoaV9kd29yZDsKKyAgICAgICAgfSBsb3dlcjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXR1c19lcnJvcjsgICAgIC8qIGV4dCBzdGF0dXMvZXJyb3IgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgIHVpbnQxNl90IHZsYW47ICAgICAgICAgICAgIC8qIFZMQU4gdGFnICovCisgICAgICAgIH0gdXBwZXI7CisgICAgfSB3YjsgIC8qIHdyaXRlYmFjayAqLworfTsKKworI2RlZmluZSBNQVhfUFNfQlVGRkVSUyA0CisvKiBSZWNlaXZlIERlc2NyaXB0b3IgLSBQYWNrZXQgU3BsaXQgKi8KK3VuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0IHsKKyAgICBzdHJ1Y3QgeworICAgICAgICAvKiBvbmUgYnVmZmVyIGZvciBwcm90b2NvbCBoZWFkZXIocyksIHRocmVlIGRhdGEgYnVmZmVycyAqLworICAgICAgICB1aW50NjRfdCBidWZmZXJfYWRkcltNQVhfUFNfQlVGRkVSU107CisgICAgfSByZWFkOworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCBtcnE7ICAgICAgICAgICAgICAvKiBNdWx0aXBsZSBSeCBRdWV1ZXMgKi8KKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByc3M7ICAgICAgICAgIC8qIFJTUyBIYXNoICovCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaXBfaWQ7ICAgIC8qIElQIGlkICovCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNzdW07ICAgICAvKiBQYWNrZXQgQ2hlY2tzdW0gKi8KKyAgICAgICAgICAgICAgICB9IGNzdW1faXA7CisgICAgICAgICAgICB9IGhpX2R3b3JkOworICAgICAgICB9IGxvd2VyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3Qgc3RhdHVzX2Vycm9yOyAgICAgLyogZXh0IHN0YXR1cy9lcnJvciAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoMDsgICAgICAgICAgLyogbGVuZ3RoIG9mIGJ1ZmZlciAwICovCisgICAgICAgICAgICB1aW50MTZfdCB2bGFuOyAgICAgICAgICAgICAvKiBWTEFOIHRhZyAqLworICAgICAgICB9IG1pZGRsZTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGhlYWRlcl9zdGF0dXM7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhbM107ICAgICAgICAvKiBsZW5ndGggb2YgYnVmZmVycyAxLTMgKi8KKyAgICAgICAgfSB1cHBlcjsKKyAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQ7CisgICAgfSB3YjsgLyogd3JpdGViYWNrICovCit9OworCiAvKiBSZWNlaXZlIERlY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfREQgICAgICAgMHgwMSAgICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfRU9QICAgICAgMHgwMiAgICAvKiBFbmQgb2YgUGFja2V0ICovCiAjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lYU00gICAgIDB4MDQgICAgLyogSWdub3JlIGNoZWNrc3VtICovCiAjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1ZQICAgICAgIDB4MDggICAgLyogSUVFRSBWTEFOIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9VRFBDUyAgICAweDEwICAgIC8qIFVEUCB4c3VtIGNhY3VsYXRlZCAqLwogI2RlZmluZSBFMTAwMF9SWERfU1RBVF9UQ1BDUyAgICAweDIwICAgIC8qIFRDUCB4c3VtIGNhbGN1bGF0ZWQgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVBDUyAgICAgMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfUElGICAgICAgMHg4MCAgICAvKiBwYXNzZWQgaW4tZXhhY3QgZmlsdGVyICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQSURWICAgIDB4MjAwICAgLyogSVAgaWRlbnRpZmljYXRpb24gdmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVURQViAgICAgMHg0MDAgICAvKiBWYWxpZCBVRFAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfQUNLICAgICAgMHg4MDAwICAvKiBBQ0sgUGFja2V0IGluZGljYXRpb24gKi8KICNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DRSAgICAgICAgMHgwMSAgICAvKiBDUkMgRXJyb3IgKi8KICNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRSAgICAgICAgMHgwMiAgICAvKiBTeW1ib2wgRXJyb3IgKi8KICNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRVEgICAgICAgMHgwNCAgICAvKiBTZXF1ZW5jZSBFcnJvciAqLwpAQCAtNDc0LDkgKzY0OCwyMCBAQAogI2RlZmluZSBFMTAwMF9SWERfRVJSX1JYRSAgICAgICAweDgwICAgIC8qIFJ4IERhdGEgRXJyb3IgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0sgMHgwRkZGICAvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KICNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfTUFTSyAgMHhFMDAwICAvKiBQcmlvcml0eSBpcyBpbiB1cHBlciAzIGJpdHMgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfU0hJRlQgMHgwMDBEICAvKiBQcmlvcml0eSBpcyBpbiB1cHBlciAzIG9mIDE2ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfUFJJX1NISUZUIDEzCiAjZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX01BU0sgIDB4MTAwMCAgLyogQ0ZJIGlzIGJpdCAxMiAqLwotI2RlZmluZSBFMTAwMF9SWERfU1BDX0NGSV9TSElGVCAweDAwMEMgIC8qIENGSSBpcyBiaXQgMTIgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19DRklfU0hJRlQgMTIKKworI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9DRSAgICAweDAxMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfU0VRICAgMHgwNDAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9DWEUgICAweDEwMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1RDUEUgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfSVBFICAgMHg0MDAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9SWEUgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgRTEwMDBfUlhEUFNfSERSU1RBVF9IRFJTUCAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9SWERQU19IRFJTVEFUX0hEUkxFTl9NQVNLICAweDAwMDAwM0ZGCiAKIC8qIG1hc2sgdG8gZGV0ZXJtaW5lIGlmIHBhY2tldHMgc2hvdWxkIGJlIGRyb3BwZWQgZHVlIHRvIGZyYW1lIGVycm9ycyAqLwogI2RlZmluZSBFMTAwMF9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLICggXApAQCAtNDg2LDYgKzY3MSwxNSBAQAogICAgIEUxMDAwX1JYRF9FUlJfQ1hFIHwgICAgICAgICAgICAgICAgXAogICAgIEUxMDAwX1JYRF9FUlJfUlhFKQogCisKKy8qIFNhbWUgbWFzaywgYnV0IGZvciBleHRlbmRlZCBhbmQgcGFja2V0IHNwbGl0IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIEUxMDAwX1JYREVYVF9FUlJfRlJBTUVfRVJSX01BU0sgKCBcCisgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UgIHwgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfU0UgIHwgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfU0VRIHwgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ1hFIHwgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFKQorCiAvKiBUcmFuc21pdCBEZXNjcmlwdG9yICovCiBzdHJ1Y3QgZTEwMDBfdHhfZGVzYyB7CiAgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLwpAQCAtNjY3LDYgKzg2MSw3IEBACiAjZGVmaW5lIEUxMDAwX0lDUyAgICAgIDB4MDAwQzggIC8qIEludGVycnVwdCBDYXVzZSBTZXQgLSBXTyAqLwogI2RlZmluZSBFMTAwMF9JTVMgICAgICAweDAwMEQwICAvKiBJbnRlcnJ1cHQgTWFzayBTZXQgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9JTUMgICAgICAweDAwMEQ4ICAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAtIFdPICovCisjZGVmaW5lIEUxMDAwX0lBTSAgICAgIDB4MDAwRTAgIC8qIEludGVycnVwdCBBY2tub3dsZWRnZSBBdXRvIE1hc2sgKi8KICNkZWZpbmUgRTEwMDBfUkNUTCAgICAgMHgwMDEwMCAgLyogUlggQ29udHJvbCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX0ZDVFRWICAgIDB4MDAxNzAgIC8qIEZsb3cgQ29udHJvbCBUcmFuc21pdCBUaW1lciBWYWx1ZSAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1RYQ1cgICAgIDB4MDAxNzggIC8qIFRYIENvbmZpZ3VyYXRpb24gV29yZCAtIFJXICovCkBAIC02NzYsOSArODcxLDIzIEBACiAjZGVmaW5lIEUxMDAwX1RCVCAgICAgIDB4MDA0NDggIC8qIFRYIEJ1cnN0IFRpbWVyIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfQUlUICAgICAgMHgwMDQ1OCAgLyogQWRhcHRpdmUgSW50ZXJmcmFtZSBTcGFjaW5nIFRocm90dGxlIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfTEVEQ1RMICAgMHgwMEUwMCAgLyogTEVEIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTCAgMHgwMEYwMCAgLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFICAweDAwRjA4ICAvKiBFeHRlbmRlZCBDb25maWd1cmF0aW9uIFNpemUgKi8KICNkZWZpbmUgRTEwMDBfUEJBICAgICAgMHgwMTAwMCAgLyogUGFja2V0IEJ1ZmZlciBBbGxvY2F0aW9uIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUEJTICAgICAgMHgwMTAwOCAgLyogUGFja2V0IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIEUxMDAwX0VFTU5HQ1RMIDB4MDEwMTAgIC8qIE1ORyBFRXByb20gQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9GTEFTSF9VUERBVEVTIDEwMDAKKyNkZWZpbmUgRTEwMDBfRUVBUkJDICAgMHgwMTAyNCAgLyogRUVQUk9NIEF1dG8gUmVhZCBCdXMgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9GTEFTSFQgICAweDAxMDI4ICAvKiBGTEFTSCBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9FRVdSICAgICAweDAxMDJDICAvKiBFRVBST00gV3JpdGUgUmVnaXN0ZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GTFNXQ1RMICAweDAxMDMwICAvKiBGTEFTSCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0ZMU1dEQVRBIDB4MDEwMzQgIC8qIEZMQVNIIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRkxTV0NOVCAgMHgwMTAzOCAgLyogRkxBU0ggQWNjZXNzIENvdW50ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRkxPUCAgICAgMHgwMTAzQyAgLyogRkxBU0ggT3Bjb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0VSVCAgICAgIDB4MDIwMDggIC8qIEVhcmx5IFJ4IFRocmVzaG9sZCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX0ZDUlRMICAgIDB4MDIxNjAgIC8qIEZsb3cgQ29udHJvbCBSZWNlaXZlIFRocmVzaG9sZCBMb3cgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9GQ1JUSCAgICAweDAyMTY4ICAvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1BTUkNUTCAgIDB4MDIxNzAgIC8qIFBhY2tldCBTcGxpdCBSZWNlaXZlIENvbnRyb2wgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9SREJBTCAgICAweDAyODAwICAvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBMb3cgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9SREJBSCAgICAweDAyODA0ICAvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfUkRMRU4gICAgMHgwMjgwOCAgLyogUlggRGVzY3JpcHRvciBMZW5ndGggLSBSVyAqLwpAQCAtNjg4LDYgKzg5Nyw3IEBACiAjZGVmaW5lIEUxMDAwX1JYRENUTCAgIDB4MDI4MjggIC8qIFJYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1JBRFYgICAgIDB4MDI4MkMgIC8qIFJYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBUaW1lciAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1JTUlBEICAgIDB4MDJDMDAgIC8qIFJYIFNtYWxsIFBhY2tldCBEZXRlY3QgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SQUlEICAgICAweDAyQzA4ICAvKiBSZWNlaXZlIEFjayBJbnRlcnJ1cHQgRGVsYXkgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9UWERNQUMgICAweDAzMDAwICAvKiBUWCBETUEgQ29udHJvbCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1RERkggICAgIDB4MDM0MTAgIC8qIFRYIERhdGEgRklGTyBIZWFkIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfVERGVCAgICAgMHgwMzQxOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgLSBSVyAqLwpAQCAtNzAzLDYgKzkxMywxNCBAQAogI2RlZmluZSBFMTAwMF9UWERDVEwgICAweDAzODI4ICAvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9UQURWICAgICAweDAzODJDICAvKiBUWCBJbnRlcnJ1cHQgQWJzb2x1dGUgRGVsYXkgVmFsIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfVFNQTVQgICAgMHgwMzgzMCAgLyogVENQIFNlZ21lbnRhdGlvbiBQQUQgJiBNaW4gVGhyZXNob2xkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzAgICAgMHgwMzg0MCAvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMCkgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwxICAgMHgwMzkwMCAvKiBUWCBEZXNjIEJhc2UgQWRkcmVzcyBMb3cgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUgxICAgMHgwMzkwNCAvKiBUWCBEZXNjIEJhc2UgQWRkcmVzcyBIaWdoICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RETEVOMSAgIDB4MDM5MDggLyogVFggRGVzYyBMZW5ndGggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIMSAgICAgMHgwMzkxMCAvKiBUWCBEZXNjIEhlYWQgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERUMSAgICAgMHgwMzkxOCAvKiBUWCBEZXNjIFRhaWwgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMMSAgMHgwMzkyOCAvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzEgICAgMHgwMzk0MCAvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMSkgKi8KICNkZWZpbmUgRTEwMDBfQ1JDRVJSUyAgMHgwNDAwMCAgLyogQ1JDIEVycm9yIENvdW50IC0gUi9jbHIgKi8KICNkZWZpbmUgRTEwMDBfQUxHTkVSUkMgMHgwNDAwNCAgLyogQWxpZ25tZW50IEVycm9yIENvdW50IC0gUi9jbHIgKi8KICNkZWZpbmUgRTEwMDBfU1lNRVJSUyAgMHgwNDAwOCAgLyogU3ltYm9sIEVycm9yIENvdW50IC0gUi9jbHIgKi8KQEAgLTc2MSw3ICs5NzksMTcgQEAKICNkZWZpbmUgRTEwMDBfQlBUQyAgICAgMHgwNDBGNCAgLyogQnJvYWRjYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLwogI2RlZmluZSBFMTAwMF9UU0NUQyAgICAweDA0MEY4ICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggLSBSL2NsciAqLwogI2RlZmluZSBFMTAwMF9UU0NURkMgICAweDA0MEZDICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggRmFpbCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0lBQyAgICAgICAweDQxMDAgIC8qIEludGVycnVwdCBBc3NlcnRpb24gQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWFBUQyAgIDB4NDEwNCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IFBhY2tldCBUaW1lciBFeHBpcmUgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWEFUQyAgIDB4NDEwOCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IEFic29sdXRlIFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYUFRDICAgMHg0MTBDICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUGFja2V0IFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYQVRDICAgMHg0MTEwICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggQWJzb2x1dGUgVGltZXIgRXhwaXJlIENvdW50ICovCisjZGVmaW5lIEUxMDAwX0lDVFhRRUMgICAweDQxMTggIC8qIEludGVycnVwdCBDYXVzZSBUeCBRdWV1ZSBFbXB0eSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYUU1UQyAgMHg0MTFDICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgTWluaW11bSBUaHJlc2hvbGQgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWERNVEMgIDB4NDEyMCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IERlc2NyaXB0b3IgTWluaW11bSBUaHJlc2hvbGQgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWE9DICAgIDB4NDEyNCAgLyogSW50ZXJydXB0IENhdXNlIFJlY2VpdmVyIE92ZXJydW4gQ291bnQgKi8KICNkZWZpbmUgRTEwMDBfUlhDU1VNICAgMHgwNTAwMCAgLyogUlggQ2hlY2tzdW0gQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JGQ1RMICAgIDB4MDUwMDggIC8qIFJlY2VpdmUgRmlsdGVyIENvbnRyb2wqLwogI2RlZmluZSBFMTAwMF9NVEEgICAgICAweDA1MjAwICAvKiBNdWx0aWNhc3QgVGFibGUgQXJyYXkgLSBSVyBBcnJheSAqLwogI2RlZmluZSBFMTAwMF9SQSAgICAgICAweDA1NDAwICAvKiBSZWNlaXZlIEFkZHJlc3MgLSBSVyBBcnJheSAqLwogI2RlZmluZSBFMTAwMF9WRlRBICAgICAweDA1NjAwICAvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCkBAIC03NzksNiArMTAwNywxNiBAQAogI2RlZmluZSBFMTAwMF9GRk1UICAgICAweDA5MDAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayBUYWJsZSAtIFJXIEFycmF5ICovCiAjZGVmaW5lIEUxMDAwX0ZGVlQgICAgIDB4MDk4MDAgIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSAtIFJXIEFycmF5ICovCiAKKyNkZWZpbmUgRTEwMDBfR0NSICAgICAgIDB4MDVCMDAgLyogUENJLUV4IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfR1NDTF8xICAgIDB4MDVCMTAgLyogUENJLUV4IFN0YXRpc3RpYyBDb250cm9sICMxICovCisjZGVmaW5lIEUxMDAwX0dTQ0xfMiAgICAweDA1QjE0IC8qIFBDSS1FeCBTdGF0aXN0aWMgQ29udHJvbCAjMiAqLworI2RlZmluZSBFMTAwMF9HU0NMXzMgICAgMHgwNUIxOCAvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzMgKi8KKyNkZWZpbmUgRTEwMDBfR1NDTF80ICAgIDB4MDVCMUMgLyogUENJLUV4IFN0YXRpc3RpYyBDb250cm9sICM0ICovCisjZGVmaW5lIEUxMDAwX0ZBQ1RQUyAgICAweDA1QjMwIC8qIEZ1bmN0aW9uIEFjdGl2ZSBhbmQgUG93ZXIgU3RhdGUgdG8gTU5HICovCisjZGVmaW5lIEUxMDAwX1NXU00gICAgICAweDA1QjUwIC8qIFNXIFNlbWFwaG9yZSAqLworI2RlZmluZSBFMTAwMF9GV1NNICAgICAgMHgwNUI1NCAvKiBGVyBTZW1hcGhvcmUgKi8KKyNkZWZpbmUgRTEwMDBfRkZMVF9EQkcgIDB4MDVGMDQgLyogRGVidWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfSElDUiAgICAgIDB4MDhGMDAgLyogSG9zdCBJbnRlZmFjZSBDb250cm9sICovCiAvKiBSZWdpc3RlciBTZXQgKDgyNTQyKQogICoKICAqIFNvbWUgb2YgdGhlIDgyNTQyIHJlZ2lzdGVycyBhcmUgbG9jYXRlZCBhdCBkaWZmZXJlbnQgb2Zmc2V0cyB0aGFuIHRoZXkgYXJlCkBAIC04MjksNiArMTA2NywxOCBAQAogI2RlZmluZSBFMTAwMF84MjU0Ml9WRlRBICAgICAweDAwNjAwCiAjZGVmaW5lIEUxMDAwXzgyNTQyX0xFRENUTCAgIEUxMDAwX0xFRENUTAogI2RlZmluZSBFMTAwMF84MjU0Ml9QQkEgICAgICBFMTAwMF9QQkEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUEJTICAgICAgRTEwMDBfUEJTCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFTU5HQ1RMIEUxMDAwX0VFTU5HQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFQVJCQyAgIEUxMDAwX0VFQVJCQworI2RlZmluZSBFMTAwMF84MjU0Ml9GTEFTSFQgICBFMTAwMF9GTEFTSFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVXUiAgICAgRTEwMDBfRUVXUgorI2RlZmluZSBFMTAwMF84MjU0Ml9GTFNXQ1RMICBFMTAwMF9GTFNXQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMU1dEQVRBIEUxMDAwX0ZMU1dEQVRBCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMU1dDTlQgIEUxMDAwX0ZMU1dDTlQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkxPUCAgICAgRTEwMDBfRkxPUAorI2RlZmluZSBFMTAwMF84MjU0Ml9FWFRDTkZfQ1RSTCAgRTEwMDBfRVhUQ05GX0NUUkwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRVhUQ05GX1NJWkUgIEUxMDAwX0VYVENORl9TSVpFCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VSVCAgICAgIEUxMDAwX0VSVAogI2RlZmluZSBFMTAwMF84MjU0Ml9SWERDVEwgICBFMTAwMF9SWERDVEwKICNkZWZpbmUgRTEwMDBfODI1NDJfUkFEViAgICAgRTEwMDBfUkFEVgogI2RlZmluZSBFMTAwMF84MjU0Ml9SU1JQRCAgICBFMTAwMF9SU1JQRApAQCAtOTEzLDYgKzExNjMsMzggQEAKICNkZWZpbmUgRTEwMDBfODI1NDJfRkZNVCAgICAgRTEwMDBfRkZNVAogI2RlZmluZSBFMTAwMF84MjU0Ml9GRlZUICAgICBFMTAwMF9GRlZUCiAjZGVmaW5lIEUxMDAwXzgyNTQyX0hPU1RfSUYgIEUxMDAwX0hPU1RfSUYKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUFNICAgICAgICAgRTEwMDBfSUFNCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFTU5HQ1RMICAgIEUxMDAwX0VFTU5HQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BTUkNUTCAgICAgIEUxMDAwX1BTUkNUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9SQUlEICAgICAgICBFMTAwMF9SQUlECisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBUkMwICAgICAgIEUxMDAwX1RBUkMwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REQkFMMSAgICAgIEUxMDAwX1REQkFMMQorI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBSDEgICAgICBFMTAwMF9UREJBSDEKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERMRU4xICAgICAgRTEwMDBfVERMRU4xCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RESDEgICAgICAgIEUxMDAwX1RESDEKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERUMSAgICAgICAgRTEwMDBfVERUMQorI2RlZmluZSBFMTAwMF84MjU0Ml9UWERDVEwxICAgICBFMTAwMF9UWERDVEwxCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBUkMxICAgICAgIEUxMDAwX1RBUkMxCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JGQ1RMICAgICAgIEUxMDAwX1JGQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dDUiAgICAgICAgIEUxMDAwX0dDUgorI2RlZmluZSBFMTAwMF84MjU0Ml9HU0NMXzEgICAgICBFMTAwMF9HU0NMXzEKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1NDTF8yICAgICAgRTEwMDBfR1NDTF8yCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dTQ0xfMyAgICAgIEUxMDAwX0dTQ0xfMworI2RlZmluZSBFMTAwMF84MjU0Ml9HU0NMXzQgICAgICBFMTAwMF9HU0NMXzQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkFDVFBTICAgICAgRTEwMDBfRkFDVFBTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NXU00gICAgICAgIEUxMDAwX1NXU00KKyNkZWZpbmUgRTEwMDBfODI1NDJfRldTTSAgICAgICAgRTEwMDBfRldTTQorI2RlZmluZSBFMTAwMF84MjU0Ml9GRkxUX0RCRyAgICBFMTAwMF9GRkxUX0RCRworI2RlZmluZSBFMTAwMF84MjU0Ml9JQUMgICAgICAgICBFMTAwMF9JQUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNSWFBUQyAgICAgRTEwMDBfSUNSWFBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1JYQVRDICAgICBFMTAwMF9JQ1JYQVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDVFhQVEMgICAgIEUxMDAwX0lDVFhQVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNUWEFUQyAgICAgRTEwMDBfSUNUWEFUQworI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1RYUUVDICAgICBFMTAwMF9JQ1RYUUVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDVFhRTVRDICAgIEUxMDAwX0lDVFhRTVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUlhETVRDICAgIEUxMDAwX0lDUlhETVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUlhPQyAgICAgIEUxMDAwX0lDUlhPQworI2RlZmluZSBFMTAwMF84MjU0Ml9ISUNSICAgICAgICBFMTAwMF9ISUNSCiAKIC8qIFN0YXRpc3RpY3MgY291bnRlcnMgY29sbGVjdGVkIGJ5IHRoZSBNQUMgKi8KIHN0cnVjdCBlMTAwMF9od19zdGF0cyB7CkBAIC05NzQsMTEgKzEyNTYsMjEgQEAKICAgICB1aW50NjRfdCBicHRjOwogICAgIHVpbnQ2NF90IHRzY3RjOwogICAgIHVpbnQ2NF90IHRzY3RmYzsKKyAgICB1aW50NjRfdCBpYWM7CisgICAgdWludDY0X3QgaWNyeHB0YzsKKyAgICB1aW50NjRfdCBpY3J4YXRjOworICAgIHVpbnQ2NF90IGljdHhwdGM7CisgICAgdWludDY0X3QgaWN0eGF0YzsKKyAgICB1aW50NjRfdCBpY3R4cWVjOworICAgIHVpbnQ2NF90IGljdHhxbXRjOworICAgIHVpbnQ2NF90IGljcnhkbXRjOworICAgIHVpbnQ2NF90IGljcnhvYzsKIH07CiAKIC8qIFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAoZTEwMDBfaHcuYykgKi8KIHN0cnVjdCBlMTAwMF9odyB7Ci0gICAgdWludDhfdCBfX2lvbWVtICpod19hZGRyOworICAgIHVpbnQ4X3QgKmh3X2FkZHI7CisgICAgdWludDhfdCAqZmxhc2hfYWRkcmVzczsKICAgICBlMTAwMF9tYWNfdHlwZSBtYWNfdHlwZTsKICAgICBlMTAwMF9waHlfdHlwZSBwaHlfdHlwZTsKICAgICB1aW50MzJfdCBwaHlfaW5pdF9zY3JpcHQ7CkBAIC05OTMsNiArMTI4NSw3IEBACiAgICAgZTEwMDBfbXNfdHlwZSBvcmlnaW5hbF9tYXN0ZXJfc2xhdmU7CiAgICAgZTEwMDBfZmZlX2NvbmZpZyBmZmVfY29uZmlnX3N0YXRlOwogICAgIHVpbnQzMl90IGFzZl9maXJtd2FyZV9wcmVzZW50OworICAgIHVpbnQzMl90IGVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudDsKICAgICB1bnNpZ25lZCBsb25nIGlvX2Jhc2U7CiAgICAgdWludDMyX3QgcGh5X2lkOwogICAgIHVpbnQzMl90IHBoeV9yZXZpc2lvbjsKQEAgLTEwMDksNiArMTMwMiw4IEBACiAgICAgdWludDMyX3QgbGVkY3RsX2RlZmF1bHQ7CiAgICAgdWludDMyX3QgbGVkY3RsX21vZGUxOwogICAgIHVpbnQzMl90IGxlZGN0bF9tb2RlMjsKKyAgICBib29sZWFuX3QgdHhfcGt0X2ZpbHRlcmluZzsKKyAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWUgbW5nX2Nvb2tpZTsKICAgICB1aW50MTZfdCBwaHlfc3BkX2RlZmF1bHQ7CiAgICAgdWludDE2X3QgYXV0b25lZ19hZHZlcnRpc2VkOwogICAgIHVpbnQxNl90IHBjaV9jbWRfd29yZDsKQEAgLTEwNDcsMTYgKzEzNDIsMjQgQEAKICAgICBib29sZWFuX3QgYWRhcHRpdmVfaWZzOwogICAgIGJvb2xlYW5fdCBpZnNfcGFyYW1zX2ZvcmNlZDsKICAgICBib29sZWFuX3QgaW5faWZzX21vZGU7CisgICAgYm9vbGVhbl90IG1uZ19yZWdfYWNjZXNzX2Rpc2FibGVkOwogfTsKIAogCiAjZGVmaW5lIEUxMDAwX0VFUFJPTV9TV0RQSU4wICAgMHgwMDAxICAgLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCiAjZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwICAgLyogTGVkIExvZ2ljIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBICAgMTYgICAvKiBPZmZzZXQgdG8gZGF0YSBpbiBFRVBST00gcmVhZC93cml0ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FICAgMiAgICAvKiBPZmZzZXQgdG8gUkVBRC9XUklURSBkb25lIGJpdCAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUICAxICAgIC8qIEZpcnN0IGJpdCBmb3IgdGVsbGluZyBwYXJ0IHRvIHN0YXJ0IG9wZXJhdGlvbiAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUldfQUREUl9TSElGVCAyICAgIC8qIFNoaWZ0IHRvIHRoZSBhZGRyZXNzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUgICAgMSAgICAvKiBGbGFnIGZvciBwb2xsaW5nIGZvciB3cml0ZSBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUE9MTF9SRUFEICAgICAwICAgIC8qIEZsYWcgZm9yIHBvbGxpbmcgZm9yIHJlYWQgY29tcGxldGUgKi8KIC8qIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLwogLyogRGV2aWNlIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9GRCAgICAgICAweDAwMDAwMDAxICAvKiBGdWxsIGR1cGxleC4wPWhhbGY7IDE9ZnVsbCAqLwogI2RlZmluZSBFMTAwMF9DVFJMX0JFTSAgICAgIDB4MDAwMDAwMDIgIC8qIEVuZGlhbiBNb2RlLjA9bGl0dGxlLDE9YmlnICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfUFJJT1IgICAgMHgwMDAwMDAwNCAgLyogUHJpb3JpdHkgb24gUENJLiAwPXJ4LDE9ZmFpciAqLworI2RlZmluZSBFMTAwMF9DVFJMX0dJT19NQVNURVJfRElTQUJMRSAweDAwMDAwMDA0IC8qQmxvY2tzIG5ldyBNYXN0ZXIgcmVxdWVzdHMgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9MUlNUICAgICAweDAwMDAwMDA4ICAvKiBMaW5rIHJlc2V0LiAwPW5vcm1hbCwxPXJlc2V0ICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfVE1FICAgICAgMHgwMDAwMDAxMCAgLyogVGVzdCBtb2RlLiAwPW5vcm1hbCwxPXRlc3QgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9TTEUgICAgICAweDAwMDAwMDIwICAvKiBTZXJpYWwgTGluayBvbiAwPWRpcywxPWVuICovCkBAIC0xMDcwLDYgKzEzNzMsNyBAQAogI2RlZmluZSBFMTAwMF9DVFJMX0JFTTMyICAgIDB4MDAwMDA0MDAgIC8qIEJpZyBFbmRpYW4gMzIgbW9kZSAqLwogI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ1NQRCAgIDB4MDAwMDA4MDAgIC8qIEZvcmNlIFNwZWVkICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRlJDRFBYICAgMHgwMDAwMTAwMCAgLyogRm9yY2UgRHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRF9VRF9QT0xBUklUWSAweDAwMDA0MDAwIC8qIERlZmluZWQgcG9sYXJpdHkgb2YgRG9jay9VbmRvY2sgaW5kaWNhdGlvbiBpbiBTRFBbMF0gKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4wICAweDAwMDQwMDAwICAvKiBTV0RQSU4gMCB2YWx1ZSAqLwogI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjEgIDB4MDAwODAwMDAgIC8qIFNXRFBJTiAxIHZhbHVlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMiAgMHgwMDEwMDAwMCAgLyogU1dEUElOIDIgdmFsdWUgKi8KQEAgLTEwODksNiArMTM5Myw3IEBACiAjZGVmaW5lIEUxMDAwX1NUQVRVU19GRCAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBGdWxsIGR1cGxleC4wPWhhbGYsMT1mdWxsICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19MVSAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBMaW5rIHVwLjA9bm8sMT1saW5rICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DX01BU0sgIDB4MDAwMDAwMEMgICAgICAvKiBQQ0kgRnVuY3Rpb24gTWFzayAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ19TSElGVCAyCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzAgICAgIDB4MDAwMDAwMDAgICAgICAvKiBGdW5jdGlvbiAwICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzEgICAgIDB4MDAwMDAwMDQgICAgICAvKiBGdW5jdGlvbiAxICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRiAgICAgIDB4MDAwMDAwMTAgICAgICAvKiB0cmFuc21pc3Npb24gcGF1c2VkICovCkBAIC0xMDk4LDYgKzE0MDMsOCBAQAogI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwICAweDAwMDAwMDQwICAgICAgLyogU3BlZWQgMTAwTWIvcyAqLwogI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCAweDAwMDAwMDgwICAgICAgLyogU3BlZWQgMTAwME1iL3MgKi8KICNkZWZpbmUgRTEwMDBfU1RBVFVTX0FTRFYgICAgICAgMHgwMDAwMDMwMCAgICAgIC8qIEF1dG8gc3BlZWQgZGV0ZWN0IHZhbHVlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19ET0NLX0NJICAgIDB4MDAwMDA4MDAgICAgICAvKiBDaGFuZ2UgaW4gRG9jay9VbmRvY2sgc3RhdGUuIENsZWFyIG9uIHdyaXRlICcwJy4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0dJT19NQVNURVJfRU5BQkxFIDB4MDAwODAwMDAgLyogU3RhdHVzIG9mIE1hc3RlciByZXF1ZXN0cy4gKi8KICNkZWZpbmUgRTEwMDBfU1RBVFVTX01UWENLT0sgICAgMHgwMDAwMDQwMCAgICAgIC8qIE1UWCBjbG9jayBydW5uaW5nIE9LICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0k2NiAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBJbiA2Nk1oeiBzbG90ICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19CVVM2NCAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBJbiA2NCBiaXQgc2xvdCAqLwpAQCAtMTEyOCw2ICsxNDM1LDE4IEBACiAjaWZuZGVmIEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUwogI2RlZmluZSBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMgMTAwMCAvKiBFRVBST00gIyBhdHRlbXB0cyB0byBnYWluIGdyYW50ICovCiAjZW5kaWYKKyNkZWZpbmUgRTEwMDBfRUVDRF9BVVRPX1JEICAgICAgICAgIDB4MDAwMDAyMDAgIC8qIEVFUFJPTSBBdXRvIFJlYWQgZG9uZSAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NJWkVfRVhfTUFTSyAgICAgMHgwMDAwNzgwMCAgLyogRUVwcm9tIFNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSVpFX0VYX1NISUZUICAgIDExCisjZGVmaW5lIEUxMDAwX0VFQ0RfTlZBRERTICAgIDB4MDAwMTgwMDAgLyogTlZNIEFkZHJlc3MgU2l6ZSAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NFTFNIQUQgICAweDAwMDIwMDAwIC8qIFNlbGVjdCBTaGFkb3cgUkFNICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfSU5JVFNSQU0gIDB4MDAwNDAwMDAgLyogSW5pdGlhbGl6ZSBTaGFkb3cgUkFNICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRkxVUEQgICAgIDB4MDAwODAwMDAgLyogVXBkYXRlIEZMQVNIICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfQVVQREVOICAgIDB4MDAxMDAwMDAgLyogRW5hYmxlIEF1dG9ub21vdXMgRkxBU0ggdXBkYXRlICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0hBRFYgICAgIDB4MDAyMDAwMDAgLyogU2hhZG93IFJBTSBEYXRhIFZhbGlkICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0VDMVZBTCAgIDB4MDA0MDAwMDAgLyogU2VjdG9yIE9uZSBWYWxpZCAqLworI2RlZmluZSBFMTAwMF9TVE1fT1BDT0RFICAgICAweERCMDAKKyNkZWZpbmUgRTEwMDBfSElDUl9GV19SRVNFVCAgMHhDMAogCiAvKiBFRVBST00gUmVhZCAqLwogI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMSAvKiBTdGFydCBSZWFkICovCkBAIC0xMTcxLDYgKzE0OTAsOCBAQAogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zMjAgICAweDAxMDAwMDAwCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzM4NCAgIDB4MDIwMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfNDQ4ICAgMHgwMzAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9JQU1FICAgICAgICAgICAweDA4MDAwMDAwICAvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgQXV0by1tYXNrICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lOVF9USU1FUl9DTFIgIDB4MjAwMDAwMDAgIC8qIENsZWFyIEludGVycnVwdCB0aW1lcnMgYWZ0ZXIgSU1TIGNsZWFyICovCiAKIC8qIE1ESSBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX01ESUNfREFUQV9NQVNLIDB4MDAwMEZGRkYKQEAgLTExODcsMTQgKzE1MDgsMTcgQEAKIC8qIExFRCBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyAgICAgICAweDAwMDAwMDBGCiAjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQgICAgICAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LX1JBVEUgICAgICAweDAwMDAwMjAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCAgICAgICAgICAgIDB4MDAwMDAwNDAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgICAgICAgICAgIDB4MDAwMDAwODAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9NQVNLICAgICAgIDB4MDAwMDBGMDAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCAgICAgIDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfQkxJTktfUkFURSAgICAgIDB4MDAwMjAwMAogI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9JVlJUICAgICAgICAgICAgMHgwMDAwNDAwMAogI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9CTElOSyAgICAgICAgICAgMHgwMDAwODAwMAogI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9NT0RFX01BU0sgICAgICAgMHgwMDBGMDAwMAogI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9NT0RFX1NISUZUICAgICAgMTYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTktfUkFURSAgICAgIDB4MDAyMDAwMDAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfSVZSVCAgICAgICAgICAgIDB4MDA0MDAwMDAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTksgICAgICAgICAgIDB4MDA4MDAwMDAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfTU9ERV9NQVNLICAgICAgIDB4MEYwMDAwMDAKQEAgLTEyMzgsNiArMTU2MiwxMCBAQAogI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgICAweDAwMDA0MDAwIC8qIEdQIEludCAzICovCiAjZGVmaW5lIEUxMDAwX0lDUl9UWERfTE9XICAgICAgIDB4MDAwMDgwMDAKICNkZWZpbmUgRTEwMDBfSUNSX1NSUEQgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFMTAwMF9JQ1JfQUNLICAgICAgICAgICAweDAwMDIwMDAwIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCisjZGVmaW5lIEUxMDAwX0lDUl9NTkcgICAgICAgICAgIDB4MDAwNDAwMDAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JQ1JfRE9DSyAgICAgICAgICAweDAwMDgwMDAwIC8qIERvY2svVW5kb2NrICovCisjZGVmaW5lIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQgIDB4ODAwMDAwMDAgLyogSWYgdGhpcyBiaXQgYXNzZXJ0ZWQsIHRoZSBkcml2ZXIgc2hvdWxkIGNsYWltIHRoZSBpbnRlcnJ1cHQgKi8KIAogLyogSW50ZXJydXB0IENhdXNlIFNldCAqLwogI2RlZmluZSBFMTAwMF9JQ1NfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KQEAgLTEyNTUsNiArMTU4Myw5IEBACiAjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLwogI2RlZmluZSBFMTAwMF9JQ1NfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCiAjZGVmaW5lIEUxMDAwX0lDU19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKKyNkZWZpbmUgRTEwMDBfSUNTX0FDSyAgICAgICBFMTAwMF9JQ1JfQUNLICAgICAgIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCisjZGVmaW5lIEUxMDAwX0lDU19NTkcgICAgICAgRTEwMDBfSUNSX01ORyAgICAgICAvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCisjZGVmaW5lIEUxMDAwX0lDU19ET0NLICAgICAgRTEwMDBfSUNSX0RPQ0sgICAgICAvKiBEb2NrL1VuZG9jayAqLwogCiAvKiBJbnRlcnJ1cHQgTWFzayBTZXQgKi8KICNkZWZpbmUgRTEwMDBfSU1TX1RYRFcgICAgICBFMTAwMF9JQ1JfVFhEVyAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCkBAIC0xMjcyLDYgKzE2MDMsOSBAQAogI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zICAgLyogR1AgSW50IDMgKi8KICNkZWZpbmUgRTEwMDBfSU1TX1RYRF9MT1cgICBFMTAwMF9JQ1JfVFhEX0xPVwogI2RlZmluZSBFMTAwMF9JTVNfU1JQRCAgICAgIEUxMDAwX0lDUl9TUlBECisjZGVmaW5lIEUxMDAwX0lNU19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSyAgICAgICAvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JTVNfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcgICAgICAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JTVNfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLICAgICAgLyogRG9jay9VbmRvY2sgKi8KIAogLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgKi8KICNkZWZpbmUgRTEwMDBfSU1DX1RYRFcgICAgICBFMTAwMF9JQ1JfVFhEVyAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCkBAIC0xMjg5LDYgKzE2MjMsOSBAQAogI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zICAgLyogR1AgSW50IDMgKi8KICNkZWZpbmUgRTEwMDBfSU1DX1RYRF9MT1cgICBFMTAwMF9JQ1JfVFhEX0xPVwogI2RlZmluZSBFMTAwMF9JTUNfU1JQRCAgICAgIEUxMDAwX0lDUl9TUlBECisjZGVmaW5lIEUxMDAwX0lNQ19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSyAgICAgICAvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JTUNfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcgICAgICAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JTUNfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLICAgICAgLyogRG9jay9VbmRvY2sgKi8KIAogLyogUmVjZWl2ZSBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX1JDVExfUlNUICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBTb2Z0d2FyZSByZXNldCAqLwpAQCAtMTMwMSw2ICsxNjM4LDggQEAKICNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTUFDICAgICAgICAweDAwMDAwMDQwICAgIC8qIE1BQyBsb29wYmFjayBtb2RlICovCiAjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1NMUCAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBzZXJpYWwgbGluayBsb29wYmFjayBtb2RlICovCiAjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1RDVlIgICAgICAgMHgwMDAwMDBDMCAgICAvKiB0Y3ZyIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9EVFlQX01BU0sgICAgICAweDAwMDAwQzAwICAgIC8qIERlc2NyaXB0b3IgdHlwZSBtYXNrICovCisjZGVmaW5lIEUxMDAwX1JDVExfRFRZUF9QUyAgICAgICAgMHgwMDAwMDQwMCAgICAvKiBQYWNrZXQgU3BsaXQgZGVzY3JpcHRvciAqLwogI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAgIDB4MDAwMDAwMDAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KICNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19RVUFUICAgICAweDAwMDAwMTAwICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCiAjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfRUlHVEggICAgMHgwMDAwMDIwMCAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLwpAQCAtMTMyNyw2ICsxNjY2LDM0IEBACiAjZGVmaW5lIEUxMDAwX1JDVExfUE1DRiAgICAgICAgICAgMHgwMDgwMDAwMCAgICAvKiBwYXNzIE1BQyBjb250cm9sIGZyYW1lcyAqLwogI2RlZmluZSBFMTAwMF9SQ1RMX0JTRVggICAgICAgICAgIDB4MDIwMDAwMDAgICAgLyogQnVmZmVyIHNpemUgZXh0ZW5zaW9uICovCiAjZGVmaW5lIEUxMDAwX1JDVExfU0VDUkMgICAgICAgICAgMHgwNDAwMDAwMCAgICAvKiBTdHJpcCBFdGhlcm5ldCBDUkMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9GTFhCVUZfTUFTSyAgICAweDc4MDAwMDAwICAgIC8qIEZsZXhpYmxlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfRkxYQlVGX1NISUZUICAgMjcgICAgICAgICAgICAvKiBGbGV4aWJsZSBidWZmZXIgc2hpZnQgKi8KKworLyogVXNlIGJ5dGUgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHNoaWZ0IHBhcmFtZXRlcnMKKyAqIFVzYWdlOgorICogICAgIHBzcmN0bCB8PSAoKChST1VORFVQKHZhbHVlMCwgMTI4KSA+PiBFMTAwMF9QU1JDVExfQlNJWkUwX1NISUZUKSAmCisgKiAgICAgICAgICAgICAgICAgIEUxMDAwX1BTUkNUTF9CU0laRTBfTUFTSykgfAorICogICAgICAgICAgICAgICAgKChST1VORFVQKHZhbHVlMSwgMTAyNCkgPj4gRTEwMDBfUFNSQ1RMX0JTSVpFMV9TSElGVCkgJgorICogICAgICAgICAgICAgICAgICBFMTAwMF9QU1JDVExfQlNJWkUxX01BU0spIHwKKyAqICAgICAgICAgICAgICAgICgoUk9VTkRVUCh2YWx1ZTIsIDEwMjQpIDw8IEUxMDAwX1BTUkNUTF9CU0laRTJfU0hJRlQpICYKKyAqICAgICAgICAgICAgICAgICAgRTEwMDBfUFNSQ1RMX0JTSVpFMl9NQVNLKSB8CisgKiAgICAgICAgICAgICAgICAoKFJPVU5EVVAodmFsdWUzLCAxMDI0KSA8PCBFMTAwMF9QU1JDVExfQlNJWkUzX1NISUZUKSB8OworICogICAgICAgICAgICAgICAgICBFMTAwMF9QU1JDVExfQlNJWkUzX01BU0spKQorICogd2hlcmUgdmFsdWUwID0gWzEyOC4uMTYyNTZdLCAgZGVmYXVsdD0yNTYKKyAqICAgICAgIHZhbHVlMSA9IFsxMDI0Li42NDUxMl0sIGRlZmF1bHQ9NDA5NgorICogICAgICAgdmFsdWUyID0gWzAuLjY0NTEyXSwgICAgZGVmYXVsdD00MDk2CisgKiAgICAgICB2YWx1ZTMgPSBbMC4uNjQ1MTJdLCAgICBkZWZhdWx0PTAKKyAqLworICAgIAorI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUwX01BU0sgICAweDAwMDAwMDdGCisjZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTFfTUFTSyAgIDB4MDAwMDNGMDAKKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMl9NQVNLICAgMHgwMDNGMDAwMAorI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUzX01BU0sgICAweDNGMDAwMDAwCisKKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMF9TSElGVCAgNyAgICAgICAgICAgIC8qIFNoaWZ0IF9yaWdodF8gNyAqLworI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUxX1NISUZUICAyICAgICAgICAgICAgLyogU2hpZnQgX3JpZ2h0XyAyICovCisjZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTJfU0hJRlQgIDYgICAgICAgICAgICAvKiBTaGlmdCBfbGVmdF8gNiAqLworI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUzX1NISUZUIDE0ICAgICAgICAgICAgLyogU2hpZnQgX2xlZnRfIDE0ICovCiAKIC8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLwogI2RlZmluZSBFMTAwMF9SRFRfREVMQVkgMHgwMDAwZmZmZiAgICAgIC8qIERlbGF5IHRpbWVyICgxPTEwMjR1cykgKi8KQEAgLTEzNDEsNiArMTcwOCwyMyBAQAogI2RlZmluZSBFMTAwMF9GQ1JUTF9SVEwgIDB4MDAwMEZGRjggICAgIC8qIE1hc2sgQml0c1sxNTozXSBmb3IgUlRMICovCiAjZGVmaW5lIEUxMDAwX0ZDUlRMX1hPTkUgMHg4MDAwMDAwMCAgICAgLyogRW5hYmxlIFhPTiBmcmFtZSB0cmFuc21pc3Npb24gKi8KIAorLyogSGVhZGVyIHNwbGl0IHJlY2VpdmUgKi8KKyNkZWZpbmUgRTEwMDBfUkZDVExfSVNDU0lfRElTICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0lTQ1NJX0RXQ19NQVNLICAgICAgMHgwMDAwMDAzRQorI2RlZmluZSBFMTAwMF9SRkNUTF9JU0NTSV9EV0NfU0hJRlQgICAgIDEKKyNkZWZpbmUgRTEwMDBfUkZDVExfTkZTV19ESVMgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX05GU1JfRElTICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFMTAwMF9SRkNUTF9ORlNfVkVSX01BU0sgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfTkZTX1ZFUl9TSElGVCAgICAgICA4CisjZGVmaW5lIEUxMDAwX1JGQ1RMX0lQVjZfRElTICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBFMTAwMF9SRkNUTF9JUFY2X1hTVU1fRElTICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfQUNLX0RJUyAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0FDS0RfRElTICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBFMTAwMF9SRkNUTF9JUEZSU1BfRElTICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfRVhURU4gICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0lQVjZfRVhfRElTICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFMTAwMF9SRkNUTF9ORVdfSVBWNl9FWFRfRElTICAgIDB4MDAwMjAwMDAKKwogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfUlhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRiAvKiBSWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCiAjZGVmaW5lIEUxMDAwX1JYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAgLyogUlhEQ1RMIEhvc3QgVGhyZXNob2xkICovCkBAIC0xMzU0LDYgKzE3MzgsOCBAQAogI2RlZmluZSBFMTAwMF9UWERDVExfR1JBTiAgICAweDAxMDAwMDAwIC8qIFRYRENUTCBHcmFudWxhcml0eSAqLwogI2RlZmluZSBFMTAwMF9UWERDVExfTFdUSFJFU0ggMHhGRTAwMDAwMCAvKiBUWERDVEwgTG93IFRocmVzaG9sZCAqLwogI2RlZmluZSBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCIDB4MDEwMTAwMDAgLyogR1JBTj0xLCBXVEhSRVNIPTEgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0MgMHgwMDQwMDAwMCAvKiBFbmFibGUgdGhlIGNvdW50aW5nIG9mIGRlc2MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkLiAqLwogCiAvKiBUcmFuc21pdCBDb25maWd1cmF0aW9uIFdvcmQgKi8KICNkZWZpbmUgRTEwMDBfVFhDV19GRCAgICAgICAgIDB4MDAwMDAwMjAgICAgICAgIC8qIFRYQ1cgZnVsbCBkdXBsZXggKi8KQEAgLTEzODcsMTIgKzE3NzMsMTYgQEAKICNkZWZpbmUgRTEwMDBfVENUTF9QQkUgICAgMHgwMDgwMDAwMCAgICAvKiBQYWNrZXQgQnVyc3QgRW5hYmxlICovCiAjZGVmaW5lIEUxMDAwX1RDVExfUlRMQyAgIDB4MDEwMDAwMDAgICAgLyogUmUtdHJhbnNtaXQgb24gbGF0ZSBjb2xsaXNpb24gKi8KICNkZWZpbmUgRTEwMDBfVENUTF9OUlRVICAgMHgwMjAwMDAwMCAgICAvKiBObyBSZS10cmFuc21pdCBvbiB1bmRlcnJ1biAqLworI2RlZmluZSBFMTAwMF9UQ1RMX01VTFIgICAweDEwMDAwMDAwICAgIC8qIE11bHRpcGxlIHJlcXVlc3Qgc3VwcG9ydCAqLwogCiAvKiBSZWNlaXZlIENoZWNrc3VtIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfUlhDU1VNX1BDU1NfTUFTSyAweDAwMDAwMEZGICAgLyogUGFja2V0IENoZWNrc3VtIFN0YXJ0ICovCiAjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUE9GTCAgICAgMHgwMDAwMDEwMCAgIC8qIElQdjQgY2hlY2tzdW0gb2ZmbG9hZCAqLwogI2RlZmluZSBFMTAwMF9SWENTVU1fVFVPRkwgICAgIDB4MDAwMDAyMDAgICAvKiBUQ1AgLyBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLwogI2RlZmluZSBFMTAwMF9SWENTVU1fSVBWNk9GTCAgIDB4MDAwMDA0MDAgICAvKiBJUHY2IGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQUENTRSAgICAweDAwMDAxMDAwICAgLyogSVAgcGF5bG9hZCBjaGVja3N1bSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX1BDU0QgICAgICAweDAwMDAyMDAwICAgLyogcGFja2V0IGNoZWNrc3VtIGRpc2FibGVkICovCisKIAogLyogRGVmaW5pdGlvbnMgZm9yIHBvd2VyIG1hbmFnZW1lbnQgYW5kIHdha2V1cCByZWdpc3RlcnMgKi8KIC8qIFdha2UgVXAgQ29udHJvbCAqLwpAQCAtMTQxMSw2ICsxODAxLDcgQEAKICNkZWZpbmUgRTEwMDBfV1VGQ19BUlAgIDB4MDAwMDAwMjAgLyogQVJQIFJlcXVlc3QgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KICNkZWZpbmUgRTEwMDBfV1VGQ19JUFY0IDB4MDAwMDAwNDAgLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLwogI2RlZmluZSBFMTAwMF9XVUZDX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSUdOT1JFX1RDTyAgICAgIDB4MDAwMDgwMDAgLyogSWdub3JlIFdha2VPbiBUQ08gcGFja2V0cyAqLwogI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBFbmFibGUgKi8KICNkZWZpbmUgRTEwMDBfV1VGQ19GTFgxIDB4MDAwMjAwMDAgLyogRmxleGlibGUgRmlsdGVyIDEgRW5hYmxlICovCiAjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMiAweDAwMDQwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAyIEVuYWJsZSAqLwpAQCAtMTQ0NiwxMyArMTgzNywxOSBAQAogI2RlZmluZSBFMTAwMF9NQU5DX0FSUF9FTiAgICAgICAgMHgwMDAwMjAwMCAvKiBFbmFibGUgQVJQIFJlcXVlc3QgRmlsdGVyaW5nICovCiAjZGVmaW5lIEUxMDAwX01BTkNfTkVJR0hCT1JfRU4gICAweDAwMDA0MDAwIC8qIEVuYWJsZSBOZWlnaGJvciBEaXNjb3ZlcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVJQX1JFU19FTiAgICAweDAwMDA4MDAwIC8qIEVuYWJsZSBBUlAgcmVzcG9uc2UgRmlsdGVyaW5nICovCiAjZGVmaW5lIEUxMDAwX01BTkNfVENPX1JFU0VUICAgICAweDAwMDEwMDAwIC8qIFRDTyBSZXNldCBPY2N1cnJlZCAqLwogI2RlZmluZSBFMTAwMF9NQU5DX1JDVl9UQ09fRU4gICAgMHgwMDAyMDAwMCAvKiBSZWNlaXZlIFRDTyBQYWNrZXRzIEVuYWJsZWQgKi8KICNkZWZpbmUgRTEwMDBfTUFOQ19SRVBPUlRfU1RBVFVTIDB4MDAwNDAwMDAgLyogU3RhdHVzIFJlcG9ydGluZyBFbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfQkxLX1BIWV9SU1RfT05fSURFICAgMHgwMDA0MDAwMCAvKiBCbG9jayBwaHkgcmVzZXRzICovCiAjZGVmaW5lIEUxMDAwX01BTkNfRU5fTUFDX0FERFJfRklMVEVSICAgMHgwMDEwMDAwMCAvKiBFbmFibGUgTUFDIGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbHRlcmluZyAqLwogI2RlZmluZSBFMTAwMF9NQU5DX0VOX01ORzJIT1NUICAgMHgwMDIwMDAwMCAvKiBFbmFibGUgTU5HIHBhY2tldHMgdG8gaG9zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnkgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9JUF9BRERSX0ZJTFRFUiAgICAweDAwNDAwMDAwIC8qIEVuYWJsZSBJUCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9YU1VNX0ZJTFRFUiAgIDB4MDA4MDAwMDAgLyogRW5hYmxlIGNoZWNrc3VtIGZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0JSX0VOICAgICAgICAgICAgMHgwMTAwMDAwMCAvKiBFbmFibGUgYnJvYWRjYXN0IGZpbHRlcmluZyAqLwogI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9SRVEgICAgICAgMHgwMTAwMDAwMCAvKiBTTUJ1cyBSZXF1ZXN0ICovCiAjZGVmaW5lIEUxMDAwX01BTkNfU01CX0dOVCAgICAgICAweDAyMDAwMDAwIC8qIFNNQnVzIEdyYW50ICovCiAjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19JTiAgICAweDA0MDAwMDAwIC8qIFNNQnVzIENsb2NrIEluICovCkBAIC0xNDYzLDExICsxODYwLDk3IEBACiAjZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfT1VUX1NISUZUICAyOCAvKiBTTUJ1cyBEYXRhIE91dCBTaGlmdCAqLwogI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfT1VUX1NISUZUICAgMjkgLyogU01CdXMgQ2xvY2sgT3V0IFNoaWZ0ICovCiAKKy8qIFNXIFNlbWFwaG9yZSBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9TV1NNX1NNQkkgICAgICAgICAweDAwMDAwMDAxIC8qIERyaXZlciBTZW1hcGhvcmUgYml0ICovCisjZGVmaW5lIEUxMDAwX1NXU01fU1dFU01CSSAgICAgIDB4MDAwMDAwMDIgLyogRlcgU2VtYXBob3JlIGJpdCAqLworI2RlZmluZSBFMTAwMF9TV1NNX1dNTkcgICAgICAgICAweDAwMDAwMDA0IC8qIFdha2UgTU5HIENsb2NrICovCisjZGVmaW5lIEUxMDAwX1NXU01fRFJWX0xPQUQgICAgIDB4MDAwMDAwMDggLyogRHJpdmVyIExvYWRlZCBCaXQgKi8KKworLyogRlcgU2VtYXBob3JlIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0ZXU01fTU9ERV9NQVNLICAgIDB4MDAwMDAwMEUgLyogRlcgbW9kZSAqLworI2RlZmluZSBFMTAwMF9GV1NNX01PREVfU0hJRlQgICAgICAgICAgICAxCisjZGVmaW5lIEUxMDAwX0ZXU01fRldfVkFMSUQgICAgIDB4MDAwMDgwMDAgLyogRlcgZXN0YWJsaXNoZWQgYSB2YWxpZCBtb2RlICovCisKKy8qIEZGTFQgRGVidWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRkZMVF9EQkdfSU5WQyAgICAgMHgwMDEwMDAwMCAvKiBJbnZhbGlkIC9DLyBjb2RlIGhhbmRsaW5nICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfbW5nX21vZGVfbm9uZSAgICAgPSAwLAorICAgIGUxMDAwX21uZ19tb2RlX2FzZiwKKyAgICBlMTAwMF9tbmdfbW9kZV9wdCwKKyAgICBlMTAwMF9tbmdfbW9kZV9pcG1pLAorICAgIGUxMDAwX21uZ19tb2RlX2hvc3RfaW50ZXJmYWNlX29ubHkKK30gZTEwMDBfbW5nX21vZGU7CisKKy8qIEhvc3QgSW50ZWZhY2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9ISUNSX0VOICAgICAgICAgICAweDAwMDAwMDAxICAvKiBFbmFibGUgQml0IC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9DICAgICAgICAgICAgMHgwMDAwMDAwMiAgLyogRHJpdmVyIHNldHMgdGhpcyBiaXQgd2hlbiBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHB1dCBjb21tYW5kIGluIFJBTSAqLworI2RlZmluZSBFMTAwMF9ISUNSX1NWICAgICAgICAgICAweDAwMDAwMDA0ICAvKiBTdGF0dXMgVmFsaWRpdHkgKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9GV1IgICAgICAgICAgMHgwMDAwMDA4MCAgLyogRlcgcmVzZXQuIFNldCBieSB0aGUgSG9zdCAqLworCisvKiBIb3N0IEludGVyZmFjZSBDb21tYW5kIEludGVyZmFjZSAtIEFkZHJlc3MgcmFuZ2UgMHg4ODAwLTB4OEVGRiAqLworI2RlZmluZSBFMTAwMF9ISV9NQVhfREFUQV9MRU5HVEggICAgICAgICAyNTIgLyogSG9zdCBJbnRlcmZhY2UgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfSElfTUFYX0JMT0NLX0JZVEVfTEVOR1RIICAxNzkyIC8qIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSAqLworI2RlZmluZSBFMTAwMF9ISV9NQVhfQkxPQ0tfRFdPUkRfTEVOR1RIICA0NDggLyogTnVtYmVyIG9mIGR3b3JkcyBpbiByYW5nZSAqLworI2RlZmluZSBFMTAwMF9ISV9DT01NQU5EX1RJTUVPVVQgICAgICAgICA1MDAgLyogVGltZSBpbiBtcyB0byBwcm9jZXNzIEhJIGNvbW1hbmQgKi8KKworc3RydWN0IGUxMDAwX2hvc3RfY29tbWFuZF9oZWFkZXIgeworICAgIHVpbnQ4X3QgY29tbWFuZF9pZDsKKyAgICB1aW50OF90IGNvbW1hbmRfbGVuZ3RoOworICAgIHVpbnQ4X3QgY29tbWFuZF9vcHRpb25zOyAgIC8qIEkvRiBiaXRzIGZvciBjb21tYW5kLCBzdGF0dXMgZm9yIHJldHVybiAqLworICAgIHVpbnQ4X3QgY2hlY2tzdW07Cit9Oworc3RydWN0IGUxMDAwX2hvc3RfY29tbWFuZF9pbmZvIHsKKyAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9jb21tYW5kX2hlYWRlciBjb21tYW5kX2hlYWRlcjsgIC8qIENvbW1hbmQgSGVhZC9Db21tYW5kIFJlc3VsdCBIZWFkIGhhcyA0IGJ5dGVzICovCisgICAgdWludDhfdCBjb21tYW5kX2RhdGFbRTEwMDBfSElfTUFYX0RBVEFfTEVOR1RIXTsgICAvKiBDb21tYW5kIGRhdGEgY2FuIGxlbmd0aCAwLi4yNTIgKi8KK307CisKKy8qIEhvc3QgU01CIHJlZ2lzdGVyICMwICovCisjZGVmaW5lIEUxMDAwX0hTTUMwUl9DTEtJTiAgICAgIDB4MDAwMDAwMDEgIC8qIFNNQiBDbG9jayBpbiAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQUlOICAgICAweDAwMDAwMDAyICAvKiBTTUIgRGF0YSBpbiAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQU9VVCAgICAweDAwMDAwMDA0ICAvKiBTTUIgRGF0YSBvdXQgKi8KKyNkZWZpbmUgRTEwMDBfSFNNQzBSX0NMS09VVCAgICAgMHgwMDAwMDAwOCAgLyogU01CIENsb2NrIG91dCAqLworCisvKiBIb3N0IFNNQiByZWdpc3RlciAjMSAqLworI2RlZmluZSBFMTAwMF9IU01DMVJfQ0xLSU4gICAgICBFMTAwMF9IU01DMFJfQ0xLSU4KKyNkZWZpbmUgRTEwMDBfSFNNQzFSX0RBVEFJTiAgICAgRTEwMDBfSFNNQzBSX0RBVEFJTgorI2RlZmluZSBFMTAwMF9IU01DMVJfREFUQU9VVCAgICBFMTAwMF9IU01DMFJfREFUQU9VVAorI2RlZmluZSBFMTAwMF9IU01DMVJfQ0xLT1VUICAgICBFMTAwMF9IU01DMFJfQ0xLT1VUCisKKy8qIEZXIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GV1NUU19GV1NfTUFTSyAgICAweDAwMDAwMEZGICAvKiBGVyBTdGF0dXMgKi8KKwogLyogV2FrZSBVcCBQYWNrZXQgTGVuZ3RoICovCiAjZGVmaW5lIEUxMDAwX1dVUExfTEVOR1RIX01BU0sgMHgwRkZGICAgLyogT25seSB0aGUgbG93ZXIgMTIgYml0cyBhcmUgdmFsaWQgKi8KIAogI2RlZmluZSBFMTAwMF9NREFMSUdOICAgICAgICAgIDQwOTYKIAorI2RlZmluZSBFMTAwMF9HQ1JfQkVNMzIgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKy8qIEZ1bmN0aW9uIEFjdGl2ZSBhbmQgUG93ZXIgU3RhdGUgdG8gTU5HICovCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMF9QT1dFUl9TVEFURV9NQVNLICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBFMTAwMF9GQUNUUFNfTEFOMF9WQUxJRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMwX0FVWF9FTiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMV9QT1dFUl9TVEFURV9NQVNLICAgICAgICAgMHgwMDAwMDBDMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzFfUE9XRVJfU1RBVEVfU0hJRlQgICAgICAgIDYKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0xBTjFfVkFMSUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMV9BVVhfRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzJfUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMyX1BPV0VSX1NUQVRFX1NISUZUICAgICAgICAxMgorI2RlZmluZSBFMTAwMF9GQUNUUFNfSURFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMyX0FVWF9FTiAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DM19QT1dFUl9TVEFURV9NQVNLICAgICAgICAgMHgwMDBDMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzNfUE9XRVJfU1RBVEVfU0hJRlQgICAgICAgIDE4CisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19TUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzNfQVVYX0VOICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkM0X1BPV0VSX1NUQVRFX01BU0sgICAgICAgICAweDAzMDAwMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DNF9QT1dFUl9TVEFURV9TSElGVCAgICAgICAgMjQKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0lQTUlfRU5BQkxFICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DNF9BVVhfRU4gICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfTU5HQ0cgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0xBTl9GVU5DX1NFTCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19QTV9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCiAvKiBFRVBST00gQ29tbWFuZHMgLSBNaWNyb3dpcmUgKi8KICNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSAgMHg2ICAvKiBFRVBST00gcmVhZCBvcGNvZGUgKi8KICNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERV9NSUNST1dJUkUgMHg1ICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCkBAIC0xNDc3LDIyICsxOTYwLDIwIEBACiAKIC8qIEVFUFJPTSBDb21tYW5kcyAtIFNQSSAqLwogI2RlZmluZSBFRVBST01fTUFYX1JFVFJZX1NQSSAgICA1MDAwIC8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgMHgzICAvKiBFRVBST00gcmVhZCBvcGNvZGUgKi8KLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERV9TUEkgMHgyICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCi0jZGVmaW5lIEVFUFJPTV9BOF9PUENPREVfU1BJICAgIDB4OCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLwotI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAweDYgIC8qIEVFUFJPTSBzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCi0jZGVmaW5lIEVFUFJPTV9XUkRJX09QQ09ERV9TUEkgIDB4NCAgLyogRUVQUk9NIHJlc2V0IFdyaXRlIEVuYWJsZSBsYXRjaCAqLwotI2RlZmluZSBFRVBST01fUkRTUl9PUENPREVfU1BJICAweDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAweDEgIC8qIEVFUFJPTSB3cml0ZSBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgICAgIDB4MDMgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSSAgICAgMHgwMiAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fQThfT1BDT0RFX1NQSSAgICAgICAgMHgwOCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLworI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAgICAgMHgwNiAgLyogRUVQUk9NIHNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1dSRElfT1BDT0RFX1NQSSAgICAgIDB4MDQgIC8qIEVFUFJPTSByZXNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSAgICAgIDB4MDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAgICAgMHgwMSAgLyogRUVQUk9NIHdyaXRlIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fRVJBU0U0S19PUENPREVfU1BJICAgMHgyMCAgLyogRUVQUk9NIEVSQVNFIDRLQiAqLworI2RlZmluZSBFRVBST01fRVJBU0U2NEtfT1BDT0RFX1NQSSAgMHhEOCAgLyogRUVQUk9NIEVSQVNFIDY0S0IgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFMjU2X09QQ09ERV9TUEkgIDB4REIgIC8qIEVFUFJPTSBFUkFTRSAyNTZCICovCiAKIC8qIEVFUFJPTSBTaXplIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEVFUFJPTV9TSVpFXzE2S0IgICAgICAgIDB4MTgwMAotI2RlZmluZSBFRVBST01fU0laRV84S0IgICAgICAgICAweDE0MDAKLSNkZWZpbmUgRUVQUk9NX1NJWkVfNEtCICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIEVFUFJPTV9TSVpFXzJLQiAgICAgICAgIDB4MEMwMAotI2RlZmluZSBFRVBST01fU0laRV8xS0IgICAgICAgICAweDA4MDAKLSNkZWZpbmUgRUVQUk9NX1NJWkVfNTEyQiAgICAgICAgMHgwNDAwCi0jZGVmaW5lIEVFUFJPTV9TSVpFXzEyOEIgICAgICAgIDB4MDAwMAorI2RlZmluZSBFRVBST01fV09SRF9TSVpFX1NISUZUICA2CisjZGVmaW5lIEVFUFJPTV9TSVpFX1NISUZUICAgICAgIDEwCiAjZGVmaW5lIEVFUFJPTV9TSVpFX01BU0sgICAgICAgIDB4MUMwMAogCiAvKiBFRVBST00gV29yZCBPZmZzZXRzICovCkBAIC0xNjA2LDcgKzIwODcsMjIgQEAKICNkZWZpbmUgSUZTX01JTiAgICAgICAgICAgICAgICA0MAogI2RlZmluZSBJRlNfUkFUSU8gICAgICAgICAgICAgIDQKIAorLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sIGFuZCBTaXplICovCisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX1BDSUVfV1JJVEVfRU5BQkxFIDB4MDAwMDAwMDEKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfUEhZX1dSSVRFX0VOQUJMRSAgMHgwMDAwMDAwMgorI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9EX1VEX0VOQUJMRSAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX0RfVURfTEFURU5DWSAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfRF9VRF9PV05FUiAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9NRElPX1NXX09XTkVSU0hJUCAweDAwMDAwMDIwCisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX01ESU9fSFdfT1dORVJTSElQIDB4MDAwMDAwNDAKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfRVhUX0NORl9QT0lOVEVSICAgMHgxRkZGMDAwMAorCisjZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFX0VYVF9QSFlfTEVOR1RIICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX1NJWkVfRVhUX0RPQ0tfTEVOR1RIICAgMHgwMDAwRkYwMAorI2RlZmluZSBFMTAwMF9FWFRDTkZfU0laRV9FWFRfUENJRV9MRU5HVEggICAweDAwRkYwMDAwCisKIC8qIFBCQSBjb25zdGFudHMgKi8KKyNkZWZpbmUgRTEwMDBfUEJBXzEySyAweDAwMEMgICAgLyogMTJLQiwgZGVmYXVsdCBSeCBhbGxvY2F0aW9uICovCiAjZGVmaW5lIEUxMDAwX1BCQV8xNksgMHgwMDEwICAgIC8qIDE2S0IsIGRlZmF1bHQgVFggYWxsb2NhdGlvbiAqLwogI2RlZmluZSBFMTAwMF9QQkFfMjJLIDB4MDAxNgogI2RlZmluZSBFMTAwMF9QQkFfMjRLIDB4MDAxOApAQCAtMTY2Myw2ICsyMTU5LDEzIEBACiAvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIGF1dG8tbmVnb3RpYXRpb24gdG8gY29tcGxldGUgKi8KICNkZWZpbmUgTElOS19VUF9USU1FT1VUICAgICAgICAgICAgIDUwMAogCisvKiBOdW1iZXIgb2YgMTAwIG1pY3Jvc2Vjb25kcyB3ZSB3YWl0IGZvciBQQ0kgRXhwcmVzcyBtYXN0ZXIgZGlzYWJsZSAqLworI2RlZmluZSBNQVNURVJfRElTQUJMRV9USU1FT1VUICAgICAgODAwCisvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIEVlcHJvbSBhdXRvIHJlYWQgYml0IGRvbmUgYWZ0ZXIgTUFDIHJlc2V0ICovCisjZGVmaW5lIEFVVE9fUkVBRF9ET05FX1RJTUVPVVQgICAgICAxMAorLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3ZSB3YWl0IGZvciBQSFkgY29uZmlndXJhdGlvbiBkb25lIGFmdGVyIE1BQyByZXNldCAqLworI2RlZmluZSBQSFlfQ0ZHX1RJTUVPVVQgICAgICAgICAgICAgNDAKKwogI2RlZmluZSBFMTAwMF9UWF9CVUZGRVJfU0laRSAoKHVpbnQzMl90KTE1MTQpCiAKIC8qIFRoZSBjYXJyaWVyIGV4dGVuc2lvbiBzeW1ib2wsIGFzIHJlY2VpdmVkIGJ5IHRoZSBOSUMuICovCkBAIC0xNzYzLDYgKzIyNjYsNyBAQAogI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9MSU5LX0hFQUxUSCAweDEzIC8qIFBIWSBMaW5rIEhlYWx0aCBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfRklGTyAgICAgICAweDE0IC8qIEdNSUkgRklGTyBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX1FVQUxJVFkgMHgxNSAvKiBQSFkgQ2hhbm5lbCBRdWFsaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQgICAgICAweDE5CiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNUICAgICAweDFGIC8qIFBIWSBQYWdlIFNlbGVjdCBDb3JlIFJlZ2lzdGVyICovCiAKIC8qIElHUDAxRTEwMDAgQUdDIFJlZ2lzdGVycyAtIHN0b3JlcyB0aGUgY2FibGUgbGVuZ3RoIHZhbHVlcyovCkBAIC0xNzcxLDEyICsyMjc1LDIwIEBACiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0NzIKICNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MTg3MgogCisvKiBJR1AwMkUxMDAwIEFHQyBSZWdpc3RlcnMgZm9yIGNhYmxlIGxlbmd0aCB2YWx1ZXMgKi8KKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQUdDX0EgICAgICAgIDB4MTFCMQorI2RlZmluZSBJR1AwMkUxMDAwX1BIWV9BR0NfQiAgICAgICAgMHgxMkIxCisjZGVmaW5lIElHUDAyRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0QjEKKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MThCMQorCiAvKiBJR1AwMUUxMDAwIERTUCBSZXNldCBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfUkVTRVQgICAweDFGMzMKICNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX1NFVCAgICAgMHgxRjcxCiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUgICAgIDB4MUYzNQogCiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICAgIDQKKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gICAgNAorCiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9BICAgIDB4MTE3MQogI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQiAgICAweDEyNzEKICNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0MgICAgMHgxNDcxCkBAIC0yMDYwLDIwICsyNTcyLDMwIEBACiAjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQiAgICAgICAgMHgwRjAwCiAjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQSAgICAgICAgMHhGMDAwCiAKKyNkZWZpbmUgSUdQMDJFMTAwMF9QTV9TUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTbWFydCBQb3dlciBEb3duICovCisjZGVmaW5lIElHUDAyRTEwMDBfUE1fRDNfTFBMVSAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRW5hYmxlIExQTFUgaW4gbm9uLUQwYSBtb2RlcyAqLworI2RlZmluZSBJR1AwMkUxMDAwX1BNX0QwX0xQTFUgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEVuYWJsZSBMUExVIGluIEQwYSBtb2RlICovCisKIC8qIElHUDAxRTEwMDAgRFNQIHJlc2V0IG1hY3JvcyAqLwogI2RlZmluZSBEU1BfUkVTRVRfRU5BQkxFICAgICAweDAKICNkZWZpbmUgRFNQX1JFU0VUX0RJU0FCTEUgICAgMHgyCiAjZGVmaW5lIEUxMDAwX01BWF9EU1BfUkVTRVRTIDEwCiAKLS8qIElHUDAxRTEwMDAgQUdDIFJlZ2lzdGVycyAqLworLyogSUdQMDFFMTAwMCAmIElHUDAyRTEwMDAgQUdDIFJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3ICAgICAgICAgLyogQ29hcnNlIC0gMTM6MTEsIEZpbmUgLSAxMDo3ICovCisjZGVmaW5lIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA5ICAgICAgICAgLyogQ29hcnNlIC0gMTU6MTMsIEZpbmUgLSAxMjo5ICovCisKKy8qIElHUDAyRTEwMDAgQUdDIFJlZ2lzdGVyIExlbmd0aCA5LWJpdCBtYXNrICovCisjZGVmaW5lIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9NQVNLICAweDdGCiAKIC8qIDcgYml0cyAoMyBDb2Fyc2UgKyA0IEZpbmUpIC0tPiAxMjggb3B0aW9uYWwgdmFsdWVzICovCiAjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIDEyOAorI2RlZmluZSBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSAxMjgKIAotLyogVGhlIHByZWNpc2lvbiBvZiB0aGUgbGVuZ3RoIGlzICsvLSAxMCBtZXRlcnMgKi8KKy8qIFRoZSBwcmVjaXNpb24gZXJyb3Igb2YgdGhlIGNhYmxlIGxlbmd0aCBpcyArLy0gMTAgbWV0ZXJzICovCiAjZGVmaW5lIElHUDAxRTEwMDBfQUdDX1JBTkdFICAgIDEwCisjZGVmaW5lIElHUDAyRTEwMDBfQUdDX1JBTkdFICAgIDEwCiAKIC8qIElHUDAxRTEwMDAgUENTIEluaXRpYWxpemF0aW9uIHJlZ2lzdGVyICovCiAvKiBiaXRzIDM6NiBpbiB0aGUgUENTIHJlZ2lzdGVycyBzdG9yZXMgdGhlIGNoYW5uZWxzIHBvbGFyaXR5ICovCkBAIC0yMTEzLDYgKzI2MzUsOCBAQAogI2RlZmluZSBNODhFMTAwMF8xMl9QSFlfSUQgTTg4RTEwMDBfRV9QSFlfSUQKICNkZWZpbmUgTTg4RTEwMDBfMTRfUEhZX0lEIE04OEUxMDAwX0VfUEhZX0lECiAjZGVmaW5lIE04OEUxMDExX0lfUkVWXzQgICAweDA0CisjZGVmaW5lIE04OEUxMTExX0lfUEhZX0lEICAweDAxNDEwQ0MwCisjZGVmaW5lIEwxTFhUOTcxQV9QSFlfSUQgICAweDAwMTM3OEUwCiAKIC8qIE1pc2NlbGxhbmVvdXMgUEhZIGJpdCBkZWZpbml0aW9ucy4gKi8KICNkZWZpbmUgUEhZX1BSRUFNQkxFICAgICAgICAweEZGRkZGRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggODI1NDlhNi4uMzI1NDk1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIApAQCAtMjksMzMgKzI5LDkgQEAKICNpbmNsdWRlICJlMTAwMC5oIgogCiAvKiBDaGFuZ2UgTG9nCi0gKiA1LjMuMTIJNi83LzA0Ci0gKiAtIGtjb21wYXQgTkVUSUZfTVNHIGZvciBvbGRlciBrZXJuZWxzICgyLjQuOSkgPHNlYW4ucC5tY2Rlcm1vdHRAaW50ZWwuY29tPgotICogLSBpZl9taWkgc3VwcG9ydCBhbmQgYXNzb2NpYXRlZCBrY29tcGF0IGZvciBvbGRlciBrZXJuZWxzCi0gKiAtIE1vcmUgZXJybG9nZ2luZyBzdXBwb3J0IGZyb20gSm9uIE1hc29uIDxqb25tYXNvbkB1cy5pYm0uY29tPgotICogLSBGaXggVFNPIGlzc3VlcyBvbiBQUEM2NCBtYWNoaW5lcyAtLSBKb24gTWFzb24gPGpvbm1hc29uQHVzLmlibS5jb20+Ci0gKgotICogNS43LjEJMTIvMTYvMDQKLSAqIC0gUmVzdXJyZWN0IDgyNTQ3RUkvR0kgcmVsYXRlZCBmaXggaW4gZTEwMDBfaW50ciB0byBhdm9pZCBkZWFkbG9ja3MuIFRoaXMKLSAqICAgZml4IHdhcyByZW1vdmVkIGFzIGl0IGNhdXNlZCBzeXN0ZW0gaW5zdGFiaWxpdHkuIFRoZSBzdXNwZWN0ZWQgY2F1c2Ugb2YgCi0gKiAgIHRoaXMgaXMgdGhlIGNhbGxlZCB0byBlMTAwMF9pcnFfZGlzYWJsZSBpbiBlMTAwMF9pbnRyLiBJbmxpbmVkIHRoZSAKLSAqICAgcmVxdWlyZWQgcGllY2Ugb2YgZTEwMDBfaXJxX2Rpc2FibGUgaW50byBlMTAwMF9pbnRyIC0gQW50b24gQmxhbmNoYXJkCi0gKiA1LjcuMAkxMi8xMC8wNAotICogLSBpbmNsdWRlIGZpeCB0byB0aGUgY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRvIHF1aXQgTkFQSSAtIFJvYmVydCBPbHNzb24KLSAqIC0gdXNlIG5ldGlmX3BvbGxfe2Rpc2FibGUvZW5hYmxlfSB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIE5BUEkgYW5kIGkvZiB1cC9kb3duCi0gKiA1LjYuNSAJMTEvMDEvMDQKLSAqIC0gRW5hYmxpbmcgTkVUSUZfRl9TRyB3aXRob3V0IGNoZWNrc3VtIG9mZmxvYWQgaXMgaWxsZWdhbCAtIAotICAgICBKb2huIE1hc29uIDxqZG1hc29uQHVzLmlibS5jb20+Ci0gKiA1LjYuMyAgICAgICAgMTAvMjYvMDQKLSAqIC0gUmVtb3ZlIHJlZHVuZGFudCBpbml0aWFsaXphdGlvbiAtIEphbWFsIEhhZGkKLSAqIC0gUmVzZXQgYnVmZmVyX2luZm8tPmRtYSBpbiB0eCByZXNvdXJjZSBjbGVhbnVwIGxvZ2ljCi0gKiA1LjYuMgkxMC8xMi8wNAotICogLSBBdm9pZCBmaWxsaW5nIHR4X3JpbmcgY29tcGxldGVseSAtIHNoZW1taW5nZXJAb3NkbC5vcmcKLSAqIC0gUmVwbGFjZSBzY2hlZHVsZV90aW1lb3V0KCkgd2l0aCBtc2xlZXAoKS9tc2xlZXBfaW50ZXJydXB0aWJsZSgpIC0KLSAqICAgbmFjY0B1cy5pYm0uY29tCi0gKiAtIFNwYXJzZSBjbGVhbnVwIC0gc2hlbW1pbmdlckBvc2RsLm9yZwotICogLSBGaXggdHggcmVzb3VyY2UgY2xlYW51cCBsb2dpYwotICogLSBMTFRYIHN1cHBvcnQgLSBha0BzdXNlLmRlIGFuZCBoYWRpQGN5YmVydXMuY2EKKyAqIDYuMC40NCsJMi8xNS8wNQorICogICBvIGFwcGxpZWQgQW50b24ncyBwYXRjaCB0byByZXNvbHZlIHR4IGhhbmcgaW4gaGFyZHdhcmUKKyAqICAgbyBBcHBsaWVkIEFuZHJldyBNb3J0b25zIHBhdGNoIC0gZTEwMDAgc3RvcHMgd29ya2luZyBhZnRlciByZXN1bWUKICAqLwogCiBjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW10gPSAiZTEwMDAiOwpAQCAtNjUsNyArNDEsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSSAiLU5BUEkiCiAjZW5kaWYKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjUuNy42LWsyIkRSSVZFUk5BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjYuMC41NC1rMiJEUklWRVJOQVBJCiBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIGNoYXIgZTEwMDBfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIjsKIApAQCAtOTYsNiArNzIsNyBAQAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTcpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTgpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTkpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMUEpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMUQpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMUUpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMjYpLApAQCAtMTEwLDYgKzg3LDkgQEAKIAlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDdCKSwKIAlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDdDKSwKIAlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDhBKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDhCKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDhDKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDk5KSwKIAkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCiAJezAsfQogfTsKQEAgLTE1NSwxMCArMTM1LDE0IEBACiBzdGF0aWMgaW50IGUxMDAwX2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KTsKIHN0YXRpYyBib29sZWFuX3QgZTEwMDBfY2xlYW5fcnhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKTsKK3N0YXRpYyBib29sZWFuX3QgZTEwMDBfY2xlYW5fcnhfaXJxX3BzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKTsKICNlbHNlCiBzdGF0aWMgYm9vbGVhbl90IGUxMDAwX2NsZWFuX3J4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgYm9vbGVhbl90IGUxMDAwX2NsZWFuX3J4X2lycV9wcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiAjZW5kaWYKIHN0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IGUxMDAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgZTEwMDBfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAogCQkJICAgaW50IGNtZCk7CkBAIC0yODYsNyArMjcwLDI5IEBACiAJCUUxMDAwX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CiAJfQogfQotCit2b2lkCitlMTAwMF91cGRhdGVfbW5nX3ZsYW4oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1aW50MTZfdCB2aWQgPSBhZGFwdGVyLT5ody5tbmdfY29va2llLnZsYW5faWQ7CisJdWludDE2X3Qgb2xkX3ZpZCA9IGFkYXB0ZXItPm1uZ192bGFuX2lkOworCWlmKGFkYXB0ZXItPnZsZ3JwKSB7CisJCWlmKCFhZGFwdGVyLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0pIHsKKwkJCWlmKGFkYXB0ZXItPmh3Lm1uZ19jb29raWUuc3RhdHVzICYKKwkJCQlFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgeworCQkJCWUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChuZXRkZXYsIHZpZCk7CisJCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSB2aWQ7CisJCQl9IGVsc2UKKwkJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CisJCQkJCisJCQlpZigob2xkX3ZpZCAhPSAodWludDE2X3QpRTEwMDBfTU5HX1ZMQU5fTk9ORSkgJiYKKwkJCQkJKHZpZCAhPSBvbGRfdmlkKSAmJiAKKwkJCQkJIWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbb2xkX3ZpZF0pCisJCQkJZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChuZXRkZXYsIG9sZF92aWQpOworCQl9CisJfQorfQorCQogaW50CiBlMTAwMF91cChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTMxMCwxOSArMzE2LDMzIEBACiAJZTEwMDBfY29uZmlndXJlX3R4KGFkYXB0ZXIpOwogCWUxMDAwX3NldHVwX3JjdGwoYWRhcHRlcik7CiAJZTEwMDBfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwotCWUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIpOwogCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisJCWFkYXB0ZXItPmhhdmVfbXNpID0gVFJVRTsKKwkJaWYoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgeworCQkJRFBSSU5USyhQUk9CRSwgRVJSLAorCQkJICJVbmFibGUgdG8gYWxsb2NhdGUgTVNJIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CisJCQlhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOworCQl9CisJfQorI2VuZGlmCiAJaWYoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJmUxMDAwX2ludHIsCiAJCSAgICAgICAgICAgICAgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLAotCQkgICAgICAgICAgICAgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkpCisJCSAgICAgICAgICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CisJfQogCiAJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7Ci0JZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAJbmV0aWZfcG9sbF9lbmFibGUobmV0ZGV2KTsKICNlbmRpZgorCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMzLDYgKzM1MywxMSBAQAogCiAJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CiAJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYpOworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMiAmJgorCSAgIGFkYXB0ZXItPmhhdmVfbXNpID09IFRSVUUpCisJCXBjaV9kaXNhYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKKyNlbmRpZgogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5waHlfaW5mb190aW1lcik7CkBAIC0zNTAsNjIgKzM3NSw5MyBAQAogCWUxMDAwX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7CiAKIAkvKiBJZiBXb0wgaXMgbm90IGVuYWJsZWQKKwkgKiBhbmQgbWFuYWdlbWVudCBtb2RlIGlzIG5vdCBJQU1UCiAJICogUG93ZXIgZG93biB0aGUgUEhZIHNvIG5vIGxpbmsgaXMgaW1wbGllZCB3aGVuIGludGVyZmFjZSBpcyBkb3duICovCi0JaWYoIWFkYXB0ZXItPndvbCAmJiBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJaWYoIWFkYXB0ZXItPndvbCAmJiBhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgJiYKKwkgICAhZTEwMDBfY2hlY2tfbW5nX21vZGUoJmFkYXB0ZXItPmh3KSAmJgorCSAgICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKSAmIEUxMDAwX01BTkNfU01CVVNfRU4pKSB7CiAJCXVpbnQxNl90IG1paV9yZWc7CiAJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmbWlpX3JlZyk7CiAJCW1paV9yZWcgfD0gTUlJX0NSX1BPV0VSX0RPV047CiAJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgbWlpX3JlZyk7CisJCW1kZWxheSgxKTsKIAl9CiB9CiAKIHZvaWQKIGUxMDAwX3Jlc2V0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewotCXVpbnQzMl90IHBiYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXVpbnQzMl90IHBiYSwgbWFuYzsKKwl1aW50MTZfdCBmY19oaWdoX3dhdGVyX21hcmsgPSBFMTAwMF9GQ19ISUdIX0RJRkY7CisJdWludDE2X3QgZmNfbG93X3dhdGVyX21hcmsgPSBFMTAwMF9GQ19MT1dfRElGRjsKIAogCS8qIFJlcGFydGl0aW9uIFBiYSBmb3IgZ3JlYXRlciB0aGFuIDlrIG10dQogCSAqIFRvIHRha2UgZWZmZWN0IENUUkwuUlNUIGlzIHJlcXVpcmVkLgogCSAqLwogCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0NykgewotCQlpZihhZGFwdGVyLT5yeF9idWZmZXJfbGVuID4gRTEwMDBfUlhCVUZGRVJfODE5MikKLQkJCXBiYSA9IEUxMDAwX1BCQV80MEs7Ci0JCWVsc2UKLQkJCXBiYSA9IEUxMDAwX1BCQV80OEs7Ci0JfSBlbHNlIHsKLQkJaWYoYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA+IEUxMDAwX1JYQlVGRkVSXzgxOTIpCi0JCQlwYmEgPSBFMTAwMF9QQkFfMjJLOwotCQllbHNlCi0JCQlwYmEgPSBFMTAwMF9QQkFfMzBLOworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCXBiYSA9IEUxMDAwX1BCQV8zMEs7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzM6CisJCXBiYSA9IEUxMDAwX1BCQV8xMks7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBiYSA9IEUxMDAwX1BCQV80OEs7CisJCWJyZWFrOworCX0KKworCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MykgJiYKKwkgICAoYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA+IEUxMDAwX1JYQlVGRkVSXzgxOTIpKSB7CisJCXBiYSAtPSA4OyAvKiBhbGxvY2F0ZSBtb3JlIEZJRk8gZm9yIFR4ICovCisJCS8qIHNlbmQgYW4gWE9GRiB3aGVuIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUKKwkJICogUnggRklGTyB0byBob2xkIG9uZSBleHRyYSBmdWxsIHNpemUgUnggcGFja2V0IAorCQkqLworCQlmY19oaWdoX3dhdGVyX21hcmsgPSBuZXRkZXYtPm10dSArIEVORVRfSEVBREVSX1NJWkUgKyAKKwkJCQkJRVRIRVJORVRfRkNTX1NJWkUgKyAxOworCQlmY19sb3dfd2F0ZXJfbWFyayA9IGZjX2hpZ2hfd2F0ZXJfbWFyayArIDg7CisJfQorCisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgewogCQlhZGFwdGVyLT50eF9maWZvX2hlYWQgPSAwOwogCQlhZGFwdGVyLT50eF9oZWFkX2FkZHIgPSBwYmEgPDwgRTEwMDBfVFhfSEVBRF9BRERSX1NISUZUOwogCQlhZGFwdGVyLT50eF9maWZvX3NpemUgPQogCQkJKEUxMDAwX1BCQV80MEsgLSBwYmEpIDw8IEUxMDAwX1BCQV9CWVRFU19TSElGVDsKIAkJYXRvbWljX3NldCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCwgMCk7CiAJfQorCiAJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUEJBLCBwYmEpOwogCiAJLyogZmxvdyBjb250cm9sIHNldHRpbmdzICovCiAJYWRhcHRlci0+aHcuZmNfaGlnaF93YXRlciA9IChwYmEgPDwgRTEwMDBfUEJBX0JZVEVTX1NISUZUKSAtCi0JCQkJICAgIEUxMDAwX0ZDX0hJR0hfRElGRjsKKwkJCQkgICAgZmNfaGlnaF93YXRlcl9tYXJrOwogCWFkYXB0ZXItPmh3LmZjX2xvd193YXRlciA9IChwYmEgPDwgRTEwMDBfUEJBX0JZVEVTX1NISUZUKSAtCi0JCQkJICAgRTEwMDBfRkNfTE9XX0RJRkY7CisJCQkJICAgZmNfbG93X3dhdGVyX21hcms7CiAJYWRhcHRlci0+aHcuZmNfcGF1c2VfdGltZSA9IEUxMDAwX0ZDX1BBVVNFX1RJTUU7CiAJYWRhcHRlci0+aHcuZmNfc2VuZF94b24gPSAxOwogCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmM7CiAKKwkvKiBBbGxvdyB0aW1lIGZvciBwZW5kaW5nIG1hc3RlciByZXF1ZXN0cyB0byBydW4gKi8KIAllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOwogCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVUMsIDApOwogCWlmKGUxMDAwX2luaXRfaHcoJmFkYXB0ZXItPmh3KSkKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSGFyZHdhcmUgRXJyb3JcbiIpOwotCisJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOwogCS8qIEVuYWJsZSBoL3cgdG8gcmVjb2duaXplIGFuIDgwMi4xUSBWTEFOIEV0aGVybmV0IHBhY2tldCAqLwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFZFVCwgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUpOwogCiAJZTEwMDBfcmVzZXRfYWRhcHRpdmUoJmFkYXB0ZXItPmh3KTsKIAllMTAwMF9waHlfZ2V0X2luZm8oJmFkYXB0ZXItPmh3LCAmYWRhcHRlci0+cGh5X2luZm8pOworCWlmIChhZGFwdGVyLT5lbl9tbmdfcHQpIHsKKwkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CisJCW1hbmMgfD0gKEUxMDAwX01BTkNfQVJQX0VOIHwgRTEwMDBfTUFOQ19FTl9NTkcySE9TVCk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOworCX0KIH0KIAogLyoqCkBAIC00MjYsMTUgKzQ4MiwxMyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXI7CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKKwl1aW50MzJfdCBzd3NtOworCiAJc3RhdGljIGludCBjYXJkc19mb3VuZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0OwotCWludCBtbWlvX2xlbjsKLQlpbnQgcGNpX3VzaW5nX2RhYzsKLQlpbnQgaTsKLQlpbnQgZXJyOworCWludCBpLCBlcnIsIHBjaV91c2luZ19kYWM7CiAJdWludDE2X3QgZWVwcm9tX2RhdGE7CiAJdWludDE2X3QgZWVwcm9tX2FwbWVfbWFzayA9IEUxMDAwX0VFUFJPTV9BUE1FOwotCiAJaWYoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTIxLDYgKzU3NSw5IEBACiAJaWYoKGVyciA9IGUxMDAwX3N3X2luaXQoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zd19pbml0OwogCisJaWYoKGVyciA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKSkKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlBIWSByZXNldCBpcyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLlxuIik7CisKIAlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgewogCQluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CiAJCQkJICAgTkVUSUZfRl9IV19DU1VNIHwKQEAgLTUzMyw2ICs1OTAsMTEgQEAKIAlpZigoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpICYmCiAJICAgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwXzgyNTQ3KSkKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworI2lmZGVmIE5FVElGX0ZfVFNPX0lQVjYKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPX0lQVjY7CisjZW5kaWYKICNlbmRpZgogCWlmKHBjaV91c2luZ19kYWMpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwpAQCAtNTQwLDYgKzYwMiw4IEBACiAgCS8qIGhhcmRfc3RhcnRfeG1pdCBpcyBzYWZlIGFnYWluc3QgcGFyYWxsZWwgbG9ja2luZyAqLwogIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsgCiAgCisJYWRhcHRlci0+ZW5fbW5nX3B0ID0gZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoJmFkYXB0ZXItPmh3KTsKKwogCS8qIGJlZm9yZSByZWFkaW5nIHRoZSBFRVBST00sIHJlc2V0IHRoZSBjb250cm9sbGVyIHRvIAogCSAqIHB1dCB0aGUgZGV2aWNlIGluIGEga25vd24gZ29vZCBzdGFydGluZyBzdGF0ZSAqLwogCQpAQCAtNTU1LDcgKzYxOSw3IEBACiAKIAkvKiBjb3B5IHRoZSBNQUMgYWRkcmVzcyBvdXQgb2YgdGhlIEVFUFJPTSAqLwogCi0JaWYgKGUxMDAwX3JlYWRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3KSkKKwlpZihlMTAwMF9yZWFkX21hY19hZGRyKCZhZGFwdGVyLT5odykpCiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOwogCkBAIC02MjksNiArNjkzLDE3IEBACiAJLyogcmVzZXQgdGhlIGhhcmR3YXJlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLwogCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCisJLyogTGV0IGZpcm13YXJlIGtub3cgdGhlIGRyaXZlciBoYXMgdGFrZW4gb3ZlciAqLworCXN3aXRjaChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NzM6CisJCXN3c20gPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNXU00pOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNLAorCQkJCXN3c20gfCBFMTAwMF9TV1NNX0RSVl9MT0FEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CiAJaWYoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkKIAkJZ290byBlcnJfcmVnaXN0ZXI7CkBAIC02NjQsNyArNzM5LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OwotCXVpbnQzMl90IG1hbmM7CisJdWludDMyX3QgbWFuYywgc3dzbTsKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKQEAgLTY3Nyw5ICs3NTIsMjEgQEAKIAkJfQogCX0KIAorCXN3aXRjaChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NzM6CisJCXN3c20gPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNXU00pOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNLAorCQkJCXN3c20gJiB+RTEwMDBfU1dTTV9EUlZfTE9BRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAotCWUxMDAwX3BoeV9od19yZXNldCgmYWRhcHRlci0+aHcpOworCWlmKCFlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soJmFkYXB0ZXItPmh3KSkKKwkJZTEwMDBfcGh5X2h3X3Jlc2V0KCZhZGFwdGVyLT5odyk7CiAKIAlpb3VubWFwKGFkYXB0ZXItPmh3Lmh3X2FkZHIpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CkBAIC03MTcsNiArODA0LDcgQEAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmh3LT5wY2lfY21kX3dvcmQpOwogCiAJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisJYWRhcHRlci0+cnhfcHNfYnNpemUwID0gRTEwMDBfUlhCVUZGRVJfMjU2OwogCWh3LT5tYXhfZnJhbWVfc2l6ZSA9IG5ldGRldi0+bXR1ICsKIAkJCSAgICAgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOwogCWh3LT5taW5fZnJhbWVfc2l6ZSA9IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRTsKQEAgLTczMCw3ICs4MTgsMTAgQEAKIAogCS8qIGluaXRpYWxpemUgZWVwcm9tIHBhcmFtZXRlcnMgKi8KIAotCWUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhodyk7CisJaWYoZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKGh3KSkgeworCQlFMTAwMF9FUlIoIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKIAlzd2l0Y2goaHctPm1hY190eXBlKSB7CiAJZGVmYXVsdDoKQEAgLTc5NSw2ICs4ODYsMTEgQEAKIAogCWlmKChlcnIgPSBlMTAwMF91cChhZGFwdGVyKSkpCiAJCWdvdG8gZXJyX3VwOworCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKKwlpZigoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgorCQkJICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkpIHsKKwkJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOworCX0KIAogCXJldHVybiBFMTAwMF9TVUNDRVNTOwogCkBAIC04MzAsMTQgKzkyNiwxOCBAQAogCWUxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCisJaWYoKGFkYXB0ZXItPmh3Lm1uZ19jb29raWUuc3RhdHVzICYKKwkJCSAgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQpKSB7CisJCWUxMDAwX3ZsYW5fcnhfa2lsbF92aWQobmV0ZGV2LCBhZGFwdGVyLT5tbmdfdmxhbl9pZCk7CisJfQogCXJldHVybiAwOwogfQogCiAvKioKICAqIGUxMDAwX2NoZWNrXzY0a19ib3VuZCAtIGNoZWNrIHRoYXQgbWVtb3J5IGRvZXNuJ3QgY3Jvc3MgNjRrQiBib3VuZGFyeQogICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqIEBiZWdpbjogYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgbWVtb3J5Ci0gKiBAZW5kOiBhZGRyZXNzIG9mIGVuZCBvZiBtZW1vcnkKKyAqIEBzdGFydDogYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgbWVtb3J5CisgKiBAbGVuOiBsZW5ndGggb2YgbWVtb3J5CiAgKiovCiBzdGF0aWMgaW5saW5lIGJvb2xlYW5fdAogZTEwMDBfY2hlY2tfNjRrX2JvdW5kKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLApAQCAtODQ2LDEyICs5NDYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGJlZ2luID0gKHVuc2lnbmVkIGxvbmcpIHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgZW5kID0gYmVnaW4gKyBsZW47CiAKLQkvKiBmaXJzdCByZXYgODI1NDUgYW5kIDgyNTQ2IG5lZWQgdG8gbm90IGFsbG93IGFueSBtZW1vcnkKLQkgKiB3cml0ZSBsb2NhdGlvbiB0byBjcm9zcyBhIDY0ayBib3VuZGFyeSBkdWUgdG8gZXJyYXRhIDIzICovCisJLyogRmlyc3QgcmV2IDgyNTQ1IGFuZCA4MjU0NiBuZWVkIHRvIG5vdCBhbGxvdyBhbnkgbWVtb3J5CisJICogd3JpdGUgbG9jYXRpb24gdG8gY3Jvc3MgNjRrIGJvdW5kYXJ5IGR1ZSB0byBlcnJhdGEgMjMgKi8KIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDUgfHwKLQkgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDYgKSB7Ci0KLQkJLyogY2hlY2sgYnVmZmVyIGRvZXNuJ3QgY3Jvc3MgNjRrQiAqLworCSAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NikgewogCQlyZXR1cm4gKChiZWdpbiBeIChlbmQgLSAxKSkgPj4gMTYpICE9IDAgPyBGQUxTRSA6IFRSVUU7CiAJfQogCkBAIC04NzUsOCArOTczLDggQEAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogdHhkci0+Y291bnQ7CiAJdHhkci0+YnVmZmVyX2luZm8gPSB2bWFsbG9jKHNpemUpOwogCWlmKCF0eGRyLT5idWZmZXJfaW5mbykgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsIAotCQkiVW5hYmxlIHRvIEFsbG9jYXRlIE1lbW9yeSBmb3IgdGhlIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCURQUklOVEsoUFJPQkUsIEVSUiwKKwkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KHR4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKQEAgLTg4OSwzOCArOTg3LDM4IEBACiAJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOwogCWlmKCF0eGRyLT5kZXNjKSB7CiBzZXR1cF90eF9kZXNjX2RpZToKLQkJRFBSSU5USyhQUk9CRSwgRVJSLCAKLQkJIlVuYWJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIHRoZSBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQl2ZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CisJCURQUklOVEsoUFJPQkUsIEVSUiwKKwkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBmaXggZm9yIGVycmF0YSAyMywgY2FudCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCisJLyogRml4IGZvciBlcnJhdGEgMjMsIGNhbid0IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KIAlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCB0eGRyLT5kZXNjLCB0eGRyLT5zaXplKSkgewogCQl2b2lkICpvbGRkZXNjID0gdHhkci0+ZGVzYzsKIAkJZG1hX2FkZHJfdCBvbGRkbWEgPSB0eGRyLT5kbWE7Ci0JCURQUklOVEsoVFhfRVJSLEVSUiwidHhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAotCQkgICAgICAgIHR4ZHItPnNpemUsIHR4ZHItPmRlc2MpOwotCQkvKiB0cnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KKwkJRFBSSU5USyhUWF9FUlIsIEVSUiwgInR4ZHIgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyAiCisJCQkJICAgICAiYXQgJXBcbiIsIHR4ZHItPnNpemUsIHR4ZHItPmRlc2MpOworCQkvKiBUcnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KIAkJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOwotCQkvKiBmYWlsZWQgYWxsb2NhdGlvbiwgY3JpdGlhbCBmYWlsdXJlICovCiAJCWlmKCF0eGRyLT5kZXNjKSB7CisJCS8qIEZhaWxlZCBhbGxvY2F0aW9uLCBjcml0aWNhbCBmYWlsdXJlICovCiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CiAJCQlnb3RvIHNldHVwX3R4X2Rlc2NfZGllOwogCQl9CiAKIAkJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgdHhkci0+ZGVzYywgdHhkci0+c2l6ZSkpIHsKIAkJCS8qIGdpdmUgdXAgKi8KLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwKLQkJCSAgICAgdHhkci0+ZGVzYywgdHhkci0+ZG1hKTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwgdHhkci0+ZGVzYywKKwkJCQkJICAgIHR4ZHItPmRtYSk7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CiAJCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkgIlVuYWJsZSB0byBBbGxvY2F0ZSBhbGlnbmVkIE1lbW9yeSBmb3IgdGhlIFRyYW5zbWl0IgotCQkgICAgICAgICAiIGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBhbGlnbmVkIG1lbW9yeSAiCisJCQkJImZvciB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nXG4iKTsKIAkJCXZmcmVlKHR4ZHItPmJ1ZmZlcl9pbmZvKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UgewotCQkJLyogZnJlZSBvbGQsIG1vdmUgb24gd2l0aCB0aGUgbmV3IG9uZSBzaW5jZSBpdHMgb2theSAqLworCQkJLyogRnJlZSBvbGQgYWxsb2NhdGlvbiwgbmV3IGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKIAkJfQogCX0KQEAgLTEwMjIsNTkgKzExMjAsODggQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCWludCBzaXplOworCWludCBzaXplLCBkZXNjX2xlbjsKIAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiByeGRyLT5jb3VudDsKIAlyeGRyLT5idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CiAJaWYoIXJ4ZHItPmJ1ZmZlcl9pbmZvKSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgCi0JCSJVbmFibGUgdG8gQWxsb2NhdGUgTWVtb3J5IGZvciB0aGUgUmVjaWV2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KHJ4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKIAorCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX3BzX3BhZ2UpICogcnhkci0+Y291bnQ7CisJcnhkci0+cHNfcGFnZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYoIXJ4ZHItPnBzX3BhZ2UpIHsKKwkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOworCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHJ4ZHItPnBzX3BhZ2UsIDAsIHNpemUpOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcHNfcGFnZV9kbWEpICogcnhkci0+Y291bnQ7CisJcnhkci0+cHNfcGFnZV9kbWEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmKCFyeGRyLT5wc19wYWdlX2RtYSkgeworCQl2ZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7CisJCWtmcmVlKHJ4ZHItPnBzX3BhZ2UpOworCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHJ4ZHItPnBzX3BhZ2VfZG1hLCAwLCBzaXplKTsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKQorCQlkZXNjX2xlbiA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7CisJZWxzZQorCQlkZXNjX2xlbiA9IHNpemVvZih1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCk7CisKIAkvKiBSb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCiAKLQlyeGRyLT5zaXplID0gcnhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOworCXJ4ZHItPnNpemUgPSByeGRyLT5jb3VudCAqIGRlc2NfbGVuOwogCUUxMDAwX1JPVU5EVVAocnhkci0+c2l6ZSwgNDA5Nik7CiAKIAlyeGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgJnJ4ZHItPmRtYSk7CiAKIAlpZighcnhkci0+ZGVzYykgewogc2V0dXBfcnhfZGVzY19kaWU6Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgCi0JCSJVbmJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIHRoZSBSZWNpZXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7CiAJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJa2ZyZWUocnhkci0+cHNfcGFnZSk7CisJCWtmcmVlKHJ4ZHItPnBzX3BhZ2VfZG1hKTsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLAorCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogZml4IGZvciBlcnJhdGEgMjMsIGNhbnQgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLworCS8qIEZpeCBmb3IgZXJyYXRhIDIzLCBjYW4ndCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCiAJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgcnhkci0+ZGVzYywgcnhkci0+c2l6ZSkpIHsKIAkJdm9pZCAqb2xkZGVzYyA9IHJ4ZHItPmRlc2M7CiAJCWRtYV9hZGRyX3Qgb2xkZG1hID0gcnhkci0+ZG1hOwotCQlEUFJJTlRLKFJYX0VSUixFUlIsCi0JCQkicnhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAotCQkJcnhkci0+c2l6ZSwgcnhkci0+ZGVzYyk7Ci0JCS8qIHRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLworCQlEUFJJTlRLKFJYX0VSUiwgRVJSLCAicnhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzICIKKwkJCQkgICAgICJhdCAlcFxuIiwgcnhkci0+c2l6ZSwgcnhkci0+ZGVzYyk7CisJCS8qIFRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLwogCQlyeGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgJnJ4ZHItPmRtYSk7Ci0JCS8qIGZhaWxlZCBhbGxvY2F0aW9uLCBjcml0aWFsIGZhaWx1cmUgKi8KIAkJaWYoIXJ4ZHItPmRlc2MpIHsKKwkJLyogRmFpbGVkIGFsbG9jYXRpb24sIGNyaXRpY2FsIGZhaWx1cmUgKi8KIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKIAkJCWdvdG8gc2V0dXBfcnhfZGVzY19kaWU7CiAJCX0KIAogCQlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCByeGRyLT5kZXNjLCByeGRyLT5zaXplKSkgewogCQkJLyogZ2l2ZSB1cCAqLwotCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLAotCQkJICAgICByeGRyLT5kZXNjLCByeGRyLT5kbWEpOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCByeGRyLT5kZXNjLAorCQkJCQkgICAgcnhkci0+ZG1hKTsKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKLQkJCURQUklOVEsoUFJPQkUsIEVSUiwgCi0JCQkJIlVuYWJsZSB0byBBbGxvY2F0ZSBhbGlnbmVkIE1lbW9yeSBmb3IgdGhlIgotCQkJCSIgUmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQkJRFBSSU5USyhQUk9CRSwgRVJSLAorCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgYWxpZ25lZCBtZW1vcnkgIgorCQkJCSJmb3IgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nXG4iKTsKIAkJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJCWtmcmVlKHJ4ZHItPnBzX3BhZ2UpOworCQkJa2ZyZWUocnhkci0+cHNfcGFnZV9kbWEpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZSB7Ci0JCQkvKiBmcmVlIG9sZCwgbW92ZSBvbiB3aXRoIHRoZSBuZXcgb25lIHNpbmNlIGl0cyBva2F5ICovCisJCQkvKiBGcmVlIG9sZCBhbGxvY2F0aW9uLCBuZXcgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLwogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOwogCQl9CiAJfQpAQCAtMTA4NywxNCArMTIxNCwxNSBAQAogfQogCiAvKioKLSAqIGUxMDAwX3NldHVwX3JjdGwgLSBjb25maWd1cmUgdGhlIHJlY2VpdmUgY29udHJvbCByZWdpc3RlcgorICogZTEwMDBfc2V0dXBfcmN0bCAtIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZSBjb250cm9sIHJlZ2lzdGVycwogICogQGFkYXB0ZXI6IEJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCiAKIHN0YXRpYyB2b2lkCiBlMTAwMF9zZXR1cF9yY3RsKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewotCXVpbnQzMl90IHJjdGw7CisJdWludDMyX3QgcmN0bCwgcmZjdGw7CisJdWludDMyX3QgcHNyY3RsID0gMDsKIAogCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOwogCkBAIC0xMTA5LDI0ICsxMjM3LDY5IEBACiAJZWxzZQogCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1NCUDsKIAorCWlmIChhZGFwdGVyLT5uZXRkZXYtPm10dSA8PSBFVEhfREFUQV9MRU4pCisJCXJjdGwgJj0gfkUxMDAwX1JDVExfTFBFOworCWVsc2UKKwkJcmN0bCB8PSBFMTAwMF9SQ1RMX0xQRTsKKwogCS8qIFNldHVwIGJ1ZmZlciBzaXplcyAqLwotCXJjdGwgJj0gfihFMTAwMF9SQ1RMX1NaXzQwOTYpOwotCXJjdGwgfD0gKEUxMDAwX1JDVExfQlNFWCB8IEUxMDAwX1JDVExfTFBFKTsKLQlzd2l0Y2ggKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pIHsKLQljYXNlIEUxMDAwX1JYQlVGRkVSXzIwNDg6Ci0JZGVmYXVsdDoKLQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzIwNDg7Ci0JCXJjdGwgJj0gfihFMTAwMF9SQ1RMX0JTRVggfCBFMTAwMF9SQ1RMX0xQRSk7Ci0JCWJyZWFrOwotCWNhc2UgRTEwMDBfUlhCVUZGRVJfNDA5NjoKLQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzQwOTY7Ci0JCWJyZWFrOwotCWNhc2UgRTEwMDBfUlhCVUZGRVJfODE5MjoKLQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzgxOTI7Ci0JCWJyZWFrOwotCWNhc2UgRTEwMDBfUlhCVUZGRVJfMTYzODQ6Ci0JCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl8xNjM4NDsKLQkJYnJlYWs7CisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKwkJLyogV2UgY2FuIG5vdyBzcGVjaWZ5IGJ1ZmZlcnMgaW4gMUsgaW5jcmVtZW50cy4KKwkJICogQlNJWkUgYW5kIEJTRVggYXJlIGlnbm9yZWQgaW4gdGhpcyBjYXNlLiAqLworCQlyY3RsIHw9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPDwgMHgxMTsKKwl9IGVsc2UgeworCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1NaXzQwOTY7CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9CU0VYOyAKKwkJc3dpdGNoIChhZGFwdGVyLT5yeF9idWZmZXJfbGVuKSB7CisJCWNhc2UgRTEwMDBfUlhCVUZGRVJfMjA0ODoKKwkJZGVmYXVsdDoKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl8yMDQ4OworCQkJcmN0bCAmPSB+RTEwMDBfUkNUTF9CU0VYOworCQkJYnJlYWs7CisJCWNhc2UgRTEwMDBfUlhCVUZGRVJfNDA5NjoKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl80MDk2OworCQkJYnJlYWs7CisJCWNhc2UgRTEwMDBfUlhCVUZGRVJfODE5MjoKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl84MTkyOworCQkJYnJlYWs7CisJCWNhc2UgRTEwMDBfUlhCVUZGRVJfMTYzODQ6CisJCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfMTYzODQ7CisJCQlicmVhazsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19FMTAwMF9QQUNLRVRfU1BMSVQKKwkvKiA4MjU3MSBhbmQgZ3JlYXRlciBzdXBwb3J0IHBhY2tldC1zcGxpdCB3aGVyZSB0aGUgcHJvdG9jb2wKKwkgKiBoZWFkZXIgaXMgcGxhY2VkIGluIHNrYi0+ZGF0YSBhbmQgdGhlIHBhY2tldCBkYXRhIGlzCisJICogcGxhY2VkIGluIHBhZ2VzIGhhbmdpbmcgb2ZmIG9mIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MuCisJICogSW4gdGhlIGNhc2Ugb2YgYSBub24tc3BsaXQsIHNrYi0+ZGF0YSBpcyBsaW5lYXJseSBmaWxsZWQsCisJICogZm9sbG93ZWQgYnkgdGhlIHBhZ2UgYnVmZmVycy4gIFRoZXJlZm9yZSwgc2tiLT5kYXRhIGlzCisJICogc2l6ZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCBwcm90b2NvbCBoZWFkZXIuCisJICovCisJYWRhcHRlci0+cnhfcHMgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikgCisJCQkgICYmIChhZGFwdGVyLT5uZXRkZXYtPm10dSAKKwkgICAgICAgICAgICAgICAgICAgICAgPCAoKDMgKiBQQUdFX1NJWkUpICsgYWRhcHRlci0+cnhfcHNfYnNpemUwKSk7CisjZW5kaWYKKwlpZihhZGFwdGVyLT5yeF9wcykgeworCQkvKiBDb25maWd1cmUgZXh0cmEgcGFja2V0LXNwbGl0IHJlZ2lzdGVycyAqLworCQlyZmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkZDVEwpOworCQlyZmN0bCB8PSBFMTAwMF9SRkNUTF9FWFRFTjsKKwkJLyogZGlzYWJsZSBJUHY2IHBhY2tldCBzcGxpdCBzdXBwb3J0ICovCisJCXJmY3RsIHw9IEUxMDAwX1JGQ1RMX0lQVjZfRElTOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRkNUTCwgcmZjdGwpOworCisJCXJjdGwgfD0gRTEwMDBfUkNUTF9EVFlQX1BTIHwgRTEwMDBfUkNUTF9TRUNSQzsKKwkJCisJCXBzcmN0bCB8PSBhZGFwdGVyLT5yeF9wc19ic2l6ZTAgPj4KKwkJCUUxMDAwX1BTUkNUTF9CU0laRTBfU0hJRlQ7CisJCXBzcmN0bCB8PSBQQUdFX1NJWkUgPj4KKwkJCUUxMDAwX1BTUkNUTF9CU0laRTFfU0hJRlQ7CisJCXBzcmN0bCB8PSBQQUdFX1NJWkUgPDwKKwkJCUUxMDAwX1BTUkNUTF9CU0laRTJfU0hJRlQ7CisJCXBzcmN0bCB8PSBQQUdFX1NJWkUgPDwKKwkJCUUxMDAwX1BTUkNUTF9CU0laRTNfU0hJRlQ7CisKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUFNSQ1RMLCBwc3JjdGwpOwogCX0KIAogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOwpAQCAtMTE0Myw5ICsxMzE2LDE4IEBACiBlMTAwMF9jb25maWd1cmVfcngoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdWludDY0X3QgcmRiYSA9IGFkYXB0ZXItPnJ4X3JpbmcuZG1hOwotCXVpbnQzMl90IHJkbGVuID0gYWRhcHRlci0+cnhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7Ci0JdWludDMyX3QgcmN0bDsKLQl1aW50MzJfdCByeGNzdW07CisJdWludDMyX3QgcmRsZW4sIHJjdGwsIHJ4Y3N1bTsKKworCWlmKGFkYXB0ZXItPnJ4X3BzKSB7CisJCXJkbGVuID0gYWRhcHRlci0+cnhfcmluZy5jb3VudCAqCisJCQlzaXplb2YodW5pb24gZTEwMDBfcnhfZGVzY19wYWNrZXRfc3BsaXQpOworCQlhZGFwdGVyLT5jbGVhbl9yeCA9IGUxMDAwX2NsZWFuX3J4X2lycV9wczsKKwkJYWRhcHRlci0+YWxsb2NfcnhfYnVmID0gZTEwMDBfYWxsb2NfcnhfYnVmZmVyc19wczsKKwl9IGVsc2UgeworCQlyZGxlbiA9IGFkYXB0ZXItPnJ4X3JpbmcuY291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOworCQlhZGFwdGVyLT5jbGVhbl9yeCA9IGUxMDAwX2NsZWFuX3J4X2lycTsKKwkJYWRhcHRlci0+YWxsb2NfcnhfYnVmID0gZTEwMDBfYWxsb2NfcnhfYnVmZmVyczsKKwl9CiAKIAkvKiBkaXNhYmxlIHJlY2VpdmVzIHdoaWxlIHNldHRpbmcgdXAgdGhlIGRlc2NyaXB0b3JzICovCiAJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CkBAIC0xMTcyLDEzICsxMzU0LDI3IEBACiAJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRULCAwKTsKIAogCS8qIEVuYWJsZSA4MjU0MyBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgZm9yIFRDUCBhbmQgVURQICovCi0JaWYoKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQzKSAmJgotCSAgIChhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpKSB7CisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKIAkJcnhjc3VtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSWENTVU0pOwotCQlyeGNzdW0gfD0gRTEwMDBfUlhDU1VNX1RVT0ZMOworCQlpZihhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpIHsKKwkJCXJ4Y3N1bSB8PSBFMTAwMF9SWENTVU1fVFVPRkw7CisKKwkJCS8qIEVuYWJsZSA4MjU3MyBJUHY0IHBheWxvYWQgY2hlY2tzdW0gZm9yIFVEUCBmcmFnbWVudHMKKwkJCSAqIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHBhY2tldC1zcGxpdC4gKi8KKwkJCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSAmJiAKKwkJCSAgIChhZGFwdGVyLT5yeF9wcykpIHsKKwkJCQlyeGNzdW0gfD0gRTEwMDBfUlhDU1VNX0lQUENTRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJ4Y3N1bSAmPSB+RTEwMDBfUlhDU1VNX1RVT0ZMOworCQkJLyogZG9uJ3QgbmVlZCB0byBjbGVhciBJUFBDU0UgYXMgaXQgZGVmYXVsdHMgdG8gMCAqLworCQl9CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJYQ1NVTSwgcnhjc3VtKTsKIAl9CiAKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpCisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEVSVCwgMHgwMTAwKTsKKwogCS8qIEVuYWJsZSBSZWNlaXZlcyAqLwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOwogfQpAQCAtMTIxMCwxMyArMTQwNiwxMSBAQAogZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2Uoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbykKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0KIAlpZihidWZmZXJfaW5mby0+ZG1hKSB7Ci0JCXBjaV91bm1hcF9wYWdlKHBkZXYsCi0JCQkgICAgICAgYnVmZmVyX2luZm8tPmRtYSwKLQkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLAotCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CiAJfQogCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKQEAgLTEyNDEsNyArMTQzNSw3IEBACiAJLyogRnJlZSBhbGwgdGhlIFR4IHJpbmcgc2tfYnVmZnMgKi8KIAogCWlmIChsaWtlbHkoYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8uc2tiICE9IE5VTEwpKSB7Ci0JCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIAorCQllMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLAogCQkJCSZhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mbyk7CiAJfQogCkBAIC0xMjgxLDYgKzE0NzUsMTAgQEAKIAogCXZmcmVlKHJ4X3JpbmctPmJ1ZmZlcl9pbmZvKTsKIAlyeF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisJa2ZyZWUocnhfcmluZy0+cHNfcGFnZSk7CisJcnhfcmluZy0+cHNfcGFnZSA9IE5VTEw7CisJa2ZyZWUocnhfcmluZy0+cHNfcGFnZV9kbWEpOworCXJ4X3JpbmctPnBzX3BhZ2VfZG1hID0gTlVMTDsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhfcmluZy0+c2l6ZSwgcnhfcmluZy0+ZGVzYywgcnhfcmluZy0+ZG1hKTsKIApAQCAtMTI5NywxNiArMTQ5NSwxOSBAQAogewogCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKIAlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgZTEwMDBfcHNfcGFnZSAqcHNfcGFnZTsKKwlzdHJ1Y3QgZTEwMDBfcHNfcGFnZV9kbWEgKnBzX3BhZ2VfZG1hOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGksIGo7CiAKIAkvKiBGcmVlIGFsbCB0aGUgUnggcmluZyBza19idWZmcyAqLwogCiAJZm9yKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgewogCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJaWYoYnVmZmVyX2luZm8tPnNrYikgewotCisJCQlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07CisJCQlwc19wYWdlX2RtYSA9ICZyeF9yaW5nLT5wc19wYWdlX2RtYVtpXTsKIAkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKIAkJCQkJIGJ1ZmZlcl9pbmZvLT5kbWEsCiAJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLApAQCAtMTMxNCwxMSArMTUxNSwyNSBAQAogCiAJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOwogCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisKKwkJCWZvcihqID0gMDsgaiA8IFBTX1BBR0VfQlVGRkVSUzsgaisrKSB7CisJCQkJaWYoIXBzX3BhZ2UtPnBzX3BhZ2Vbal0pIGJyZWFrOworCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKKwkJCQkJCSBwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0sCisJCQkJCQkgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXBzX3BhZ2VfZG1hLT5wc19wYWdlX2RtYVtqXSA9IDA7CisJCQkJcHV0X3BhZ2UocHNfcGFnZS0+cHNfcGFnZVtqXSk7CisJCQkJcHNfcGFnZS0+cHNfcGFnZVtqXSA9IE5VTEw7CisJCQl9CiAJCX0KIAl9CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogcnhfcmluZy0+Y291bnQ7CiAJbWVtc2V0KHJ4X3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlKSAqIHJ4X3JpbmctPmNvdW50OworCW1lbXNldChyeF9yaW5nLT5wc19wYWdlLCAwLCBzaXplKTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSkgKiByeF9yaW5nLT5jb3VudDsKKwltZW1zZXQocnhfcmluZy0+cHNfcGFnZV9kbWEsIDAsIHNpemUpOwogCiAJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwogCkBAIC0xNDIyLDE1ICsxNjM3LDE1IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQzMl90IHJjdGw7CiAJdWludDMyX3QgaGFzaF92YWx1ZTsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+dHhfbG9jaywgZmxhZ3MpOwogCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisKIAlyY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOwogCiAJaWYobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CkBAIC0xNTU2LDYgKzE3NzEsMTEgQEAKIAl1aW50MzJfdCBsaW5rOwogCiAJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKwkJZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoJmFkYXB0ZXItPmh3KTsKKwkJaWYoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0gYWRhcHRlci0+aHcubW5nX2Nvb2tpZS52bGFuX2lkKQorCQkJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOworCX0JCiAKIAlpZigoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKIAkgICAhKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFhDVykgJiBFMTAwMF9UWENXX0FORSkpCkBAIC0xNjMyLDcgKzE4NTIsNyBAQAogCS8qIENhdXNlIHNvZnR3YXJlIGludGVycnVwdCB0byBlbnN1cmUgcnggcmluZyBpcyBjbGVhbmVkICovCiAJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSUNTLCBFMTAwMF9JQ1NfUlhETVQwKTsKIAotCS8qIEZvcmNlIGRldGVjdGlvbiBvZiBodW5nIGNvbnRyb2xsZXIgZXZlcnkgd2F0Y2hkb2cgcGVyaW9kKi8KKwkvKiBGb3JjZSBkZXRlY3Rpb24gb2YgaHVuZyBjb250cm9sbGVyIGV2ZXJ5IHdhdGNoZG9nIHBlcmlvZCAqLwogCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gVFJVRTsKIAogCS8qIFJlc2V0IHRoZSB0aW1lciAqLwpAQCAtMTY0Miw2ICsxODYyLDcgQEAKICNkZWZpbmUgRTEwMDBfVFhfRkxBR1NfQ1NVTQkJMHgwMDAwMDAwMQogI2RlZmluZSBFMTAwMF9UWF9GTEFHU19WTEFOCQkweDAwMDAwMDAyCiAjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1RTTwkJMHgwMDAwMDAwNAorI2RlZmluZSBFMTAwMF9UWF9GTEFHU19JUFY0CQkweDAwMDAwMDA4CiAjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fTUFTSwkweGZmZmYwMDAwCiAjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fU0hJRlQJMTYKIApAQCAtMTY1Miw3ICsxODczLDcgQEAKIAlzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICpjb250ZXh0X2Rlc2M7CiAJdW5zaWduZWQgaW50IGk7CiAJdWludDMyX3QgY21kX2xlbmd0aCA9IDA7Ci0JdWludDE2X3QgaXBjc2UsIHR1Y3NlLCBtc3M7CisJdWludDE2X3QgaXBjc2UgPSAwLCB0dWNzZSwgbXNzOwogCXVpbnQ4X3QgaXBjc3MsIGlwY3NvLCB0dWNzcywgdHVjc28sIGhkcl9sZW47CiAJaW50IGVycjsKIApAQCAtMTY2NSwyMyArMTg4NiwzNyBAQAogCiAJCWhkcl9sZW4gPSAoKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CiAJCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemU7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gMDsKLQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5oLnRoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19UQ1AsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisJCWlmKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVApKSB7CisJCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7CisJCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQkJc2tiLT5oLnRoLT5jaGVjayA9CisJCQkJfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJCSAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJCSAgIDAsCisJCQkJCQkgICBJUFBST1RPX1RDUCwKKwkJCQkJCSAgIDApOworCQkJY21kX2xlbmd0aCA9IEUxMDAwX1RYRF9DTURfSVA7CisJCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOworI2lmZGVmIE5FVElGX0ZfVFNPX0lQVjYKKwkJfSBlbHNlIGlmKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVBWNikpIHsKKwkJCXNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gMDsKKwkJCXNrYi0+aC50aC0+Y2hlY2sgPQorCQkJCX5jc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQkJICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCQkJCSAwLAorCQkJCQkJIElQUFJPVE9fVENQLAorCQkJCQkJIDApOworCQkJaXBjc2UgPSAwOworI2VuZGlmCisJCX0KIAkJaXBjc3MgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKIAkJaXBjc28gPSAodm9pZCAqKSYoc2tiLT5uaC5pcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOwotCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOwogCQl0dWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CiAJCXR1Y3NvID0gKHZvaWQgKikmKHNrYi0+aC50aC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CiAJCXR1Y3NlID0gMDsKIAogCQljbWRfbGVuZ3RoIHw9IChFMTAwMF9UWERfQ01EX0RFWFQgfCBFMTAwMF9UWERfQ01EX1RTRSB8Ci0JCQkgICAgICAgRTEwMDBfVFhEX0NNRF9JUCB8IEUxMDAwX1RYRF9DTURfVENQIHwKLQkJCSAgICAgICAoc2tiLT5sZW4gLSAoaGRyX2xlbikpKTsKKwkJCSAgICAgICBFMTAwMF9UWERfQ01EX1RDUCB8IChza2ItPmxlbiAtIChoZHJfbGVuKSkpOwogCiAJCWkgPSBhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlOwogCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CkBAIC0xNzYwLDYgKzE5OTUsMTUgQEAKIAkJaWYodW5saWtlbHkobXNzICYmICFucl9mcmFncyAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCiAJCQlzaXplIC09IDQ7CiAjZW5kaWYKKwkJLyogd29yay1hcm91bmQgZm9yIGVycmF0YSAxMCBhbmQgaXQgYXBwbGllcworCQkgKiB0byBhbGwgY29udHJvbGxlcnMgaW4gUENJLVggbW9kZQorCQkgKiBUaGUgZml4IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIGEKKwkJICogcGFja2V0IGlzIHNtYWxsZXIgdGhhbiAyMDQ4IC0gMTYgLSAxNiAob3IgMjAxNikgYnl0ZXMKKwkJICovCisJCWlmKHVubGlrZWx5KChhZGFwdGVyLT5ody5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSAmJgorCQkgICAgICAgICAgICAgICAgKHNpemUgPiAyMDE1KSAmJiBjb3VudCA9PSAwKSkKKwkJICAgICAgICBzaXplID0gMjAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCS8qIFdvcmthcm91bmQgZm9yIHBvdGVudGlhbCA4MjU0NCBoYW5nIGluIFBDSS1YLiAgQXZvaWQKIAkJICogdGVybWluYXRpbmcgYnVmZmVycyB3aXRoaW4gZXZlbmx5LWFsaWduZWQgZHdvcmRzLiAqLwogCQlpZih1bmxpa2VseShhZGFwdGVyLT5wY2l4XzgyNTQ0ICYmCkBAIC0xODQwLDcgKzIwODQsMTAgQEAKIAlpZihsaWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19UU08pKSB7CiAJCXR4ZF9sb3dlciB8PSBFMTAwMF9UWERfQ01EX0RFWFQgfCBFMTAwMF9UWERfRFRZUF9EIHwKIAkJICAgICAgICAgICAgIEUxMDAwX1RYRF9DTURfVFNFOwotCQl0eGRfdXBwZXIgfD0gKEUxMDAwX1RYRF9QT1BUU19JWFNNIHwgRTEwMDBfVFhEX1BPUFRTX1RYU00pIDw8IDg7CisJCXR4ZF91cHBlciB8PSBFMTAwMF9UWERfUE9QVFNfVFhTTSA8PCA4OworCisJCWlmKGxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX0lQVjQpKQorCQkJdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19JWFNNIDw8IDg7CiAJfQogCiAJaWYobGlrZWx5KHR4X2ZsYWdzICYgRTEwMDBfVFhfRkxBR1NfQ1NVTSkpIHsKQEAgLTE5MTUsNiArMjE2Miw1MyBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIE1JTklNVU1fREhDUF9QQUNLRVRfU0laRSAyODIKK3N0YXRpYyBpbmxpbmUgaW50CitlMTAwMF90cmFuc2Zlcl9kaGNwX2luZm8oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgbGVuZ3RoLCBvZmZzZXQ7CisJaWYodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCWlmKCEoKHZsYW5fdHhfdGFnX2dldChza2IpID09IGFkYXB0ZXItPmh3Lm1uZ19jb29raWUudmxhbl9pZCkgJiYKKwkJCSggYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgorCQkJICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkpICkKKwkJCXJldHVybiAwOworCX0KKwlpZihodG9ucyhFVEhfUF9JUCkgPT0gc2tiLT5wcm90b2NvbCkgeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisJCWlmKElQUFJPVE9fVURQID09IGlwLT5wcm90b2NvbCkgeworCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5oLnVoKTsKKwkJCWlmKG50b2hzKHVkcC0+ZGVzdCkgPT0gNjcpIHsKKwkJCQlvZmZzZXQgPSAodWludDhfdCAqKXVkcCArIDggLSBza2ItPmRhdGE7CisJCQkJbGVuZ3RoID0gc2tiLT5sZW4gLSBvZmZzZXQ7CisKKwkJCQlyZXR1cm4gZTEwMDBfbW5nX3dyaXRlX2RoY3BfaW5mbyhodywKKwkJCQkJCSh1aW50OF90ICopdWRwICsgOCwgbGVuZ3RoKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZigoc2tiLT5sZW4gPiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpICYmICghc2tiLT5wcm90b2NvbCkpIHsKKwkJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOworCQlpZigoaHRvbnMoRVRIX1BfSVApID09IGV0aC0+aF9wcm90bykpIHsKKwkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSAKKwkJCQkoc3RydWN0IGlwaGRyICopKCh1aW50OF90ICopc2tiLT5kYXRhKzE0KTsKKwkJCWlmKElQUFJPVE9fVURQID09IGlwLT5wcm90b2NvbCkgeworCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IAorCQkJCQkoc3RydWN0IHVkcGhkciAqKSgodWludDhfdCAqKWlwICsgCisJCQkJCQkoaXAtPmlobCA8PCAyKSk7CisJCQkJaWYobnRvaHModWRwLT5kZXN0KSA9PSA2NykgeworCQkJCQlvZmZzZXQgPSAodWludDhfdCAqKXVkcCArIDggLSBza2ItPmRhdGE7CisJCQkJCWxlbmd0aCA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCisJCQkJCXJldHVybiBlMTAwMF9tbmdfd3JpdGVfZGhjcF9pbmZvKGh3LAorCQkJCQkJCSh1aW50OF90ICopdWRwICsgOCwgCisJCQkJCQkJbGVuZ3RoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgVFhEX1VTRV9DT1VOVChTLCBYKSAoKChTKSA+PiAoWCkpICsgMSApCiBzdGF0aWMgaW50CiBlMTAwMF94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0xOTM5LDcgKzIyMzMsNyBAQAogCiAjaWZkZWYgTkVUSUZfRl9UU08KIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOwotCS8qIFRoZSBjb250cm9sbGVyIGRvZXMgYSBzaW1wbGUgY2FsY3VsYXRpb24gdG8KKwkvKiBUaGUgY29udHJvbGxlciBkb2VzIGEgc2ltcGxlIGNhbGN1bGF0aW9uIHRvIAogCSAqIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgRklGTyBiZWZvcmUKIAkgKiBpbml0aWF0aW5nIHRoZSBETUEgZm9yIGVhY2ggYnVmZmVyLiAgVGhlIGNhbGMgaXM6CiAJICogNCA9IGNlaWwoYnVmZmVyIGxlbi9tc3MpLiAgVG8gbWFrZSBzdXJlIHdlIGRvbid0CkBAIC0xOTUyLDcgKzIyNDYsNyBAQAogCiAJaWYoKG1zcykgfHwgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkKIAkJY291bnQrKzsKLQljb3VudCsrOwkvKiBmb3Igc2VudGluZWwgZGVzYyAqLworCWNvdW50Kys7CiAjZWxzZQogCWlmKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQogCQljb3VudCsrOwpAQCAtMTk2Miw2ICsyMjU2LDEzIEBACiAJaWYoYWRhcHRlci0+cGNpeF84MjU0NCkKIAkJY291bnQrKzsKIAorCS8qIHdvcmstYXJvdW5kIGZvciBlcnJhdGEgMTAgYW5kIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRyb2xsZXJzIAorCSAqIGluIFBDSS1YIG1vZGUsIHNvIGFkZCBvbmUgbW9yZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3VudAorCSAqLworCWlmKHVubGlrZWx5KChhZGFwdGVyLT5ody5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSAmJgorCQkJKGxlbiA+IDIwMTUpKSkKKwkJY291bnQrKzsKKwogCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAlmb3IoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKQogCQljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl0uc2l6ZSwKQEAgLTE5NzUsNiArMjI3Niw5IEBACiAgCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IAogIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAogIAl9IAorCWlmKGFkYXB0ZXItPmh3LnR4X3BrdF9maWx0ZXJpbmcgJiYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczKSApCisJCWUxMDAwX3RyYW5zZmVyX2RoY3BfaW5mbyhhZGFwdGVyLCBza2IpOworCiAKIAkvKiBuZWVkOiBjb3VudCArIDIgZGVzYyBnYXAgdG8ga2VlcCB0YWlsIGZyb20gdG91Y2hpbmcKIAkgKiBoZWFkLCBvdGhlcndpc2UgdHJ5IG5leHQgdGltZSAqLwpAQCAtMjAxMSw2ICsyMzE1LDEyIEBACiAJZWxzZSBpZihsaWtlbHkoZTEwMDBfdHhfY3N1bShhZGFwdGVyLCBza2IpKSkKIAkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfQ1NVTTsKIAorCS8qIE9sZCBtZXRob2Qgd2FzIHRvIGFzc3VtZSBJUHY0IHBhY2tldCBieSBkZWZhdWx0IGlmIFRTTyB3YXMgZW5hYmxlZC4KKwkgKiA4MjU3MyBoYXJkd2FyZSBzdXBwb3J0cyBUU08gY2FwYWJpbGl0aWVzIGZvciBJUHY2IGFzIHdlbGwuLi4KKwkgKiBubyBsb25nZXIgYXNzdW1lLCB3ZSBtdXN0LiAqLworCWlmKGxpa2VseShza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkpCisJCXR4X2ZsYWdzIHw9IEUxMDAwX1RYX0ZMQUdTX0lQVjQ7CisKIAllMTAwMF90eF9xdWV1ZShhZGFwdGVyLAogCQllMTAwMF90eF9tYXAoYWRhcHRlciwgc2tiLCBmaXJzdCwgbWF4X3Blcl90eGQsIG5yX2ZyYWdzLCBtc3MpLAogCQl0eF9mbGFncyk7CkBAIC0yMDc3LDcgKzIzODcsNiBAQAogZTEwMDBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKLQlpbnQgb2xkX210dSA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CiAJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CiAKIAlpZigobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fApAQCAtMjA4NiwyOSArMjM5NSw0NSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYobWF4X2ZyYW1lIDw9IE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgewotCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfMjA0ODsKLQotCX0gZWxzZSBpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgIkp1bWJvIEZyYW1lcyBub3Qgc3VwcG9ydGVkIG9uIDgyNTQyXG4iKTsKKyNkZWZpbmUgTUFYX1NURF9KVU1CT19GUkFNRV9TSVpFIDkyMTYKKwkvKiBtaWdodCB3YW50IHRoaXMgdG8gYmUgYmlnZ2VyIGVudW0gY2hlY2suLi4gKi8KKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzMgJiYKKwkgICAgbWF4X2ZyYW1lID4gTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkp1bWJvIEZyYW1lcyBub3Qgc3VwcG9ydGVkICIKKwkJCQkgICAgIm9uIDgyNTczXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IEUxMDAwX1JYQlVGRkVSXzQwOTYpIHsKLQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzQwOTY7Ci0KLQl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IEUxMDAwX1JYQlVGRkVSXzgxOTIpIHsKLQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzgxOTI7Ci0KLQl9IGVsc2UgewotCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfMTYzODQ7CiAJfQogCi0JaWYob2xkX210dSAhPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuICYmIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IG1heF9mcmFtZTsKKwkJRTEwMDBfUk9VTkRVUChhZGFwdGVyLT5yeF9idWZmZXJfbGVuLCAxMDI0KTsKKwl9IGVsc2UgeworCQlpZih1bmxpa2VseSgoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgJiYKKwkJICAgKG1heF9mcmFtZSA+IE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkpKSB7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZCAiCisJCQkJCSAgICAib24gODI1NDJcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfSBlbHNlIHsKKwkJCWlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl8yMDQ4KSB7CisJCQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisJCQl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IEUxMDAwX1JYQlVGRkVSXzQwOTYpIHsKKwkJCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfNDA5NjsKKwkJCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gRTEwMDBfUlhCVUZGRVJfODE5MikgeworCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl84MTkyOworCQkJfSBlbHNlIGlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl8xNjM4NCkgeworCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl8xNjM4NDsKKwkJCX0KKwkJfQorCX0KKworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewogCQllMTAwMF9kb3duKGFkYXB0ZXIpOwogCQllMTAwMF91cChhZGFwdGVyKTsKIAl9CiAKLQluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAJYWRhcHRlci0+aHcubWF4X2ZyYW1lX3NpemUgPSBtYXhfZnJhbWU7CiAKIAlyZXR1cm4gMDsKQEAgLTIxOTksNiArMjUyNCwxNyBAQAogCQlhZGFwdGVyLT5zdGF0cy50c2N0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEMpOwogCQlhZGFwdGVyLT5zdGF0cy50c2N0ZmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RGQyk7CiAJfQorCWlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisJCWFkYXB0ZXItPnN0YXRzLmlhYyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUFDKTsKKwkJYWRhcHRlci0+c3RhdHMuaWNyeG9jICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYT0MpOworCQlhZGFwdGVyLT5zdGF0cy5pY3J4cHRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYUFRDKTsKKwkJYWRhcHRlci0+c3RhdHMuaWNyeGF0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWEFUQyk7CisJCWFkYXB0ZXItPnN0YXRzLmljdHhwdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhQVEMpOworCQlhZGFwdGVyLT5zdGF0cy5pY3R4YXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYQVRDKTsKKwkJYWRhcHRlci0+c3RhdHMuaWN0eHFlYyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFFFQyk7CisJCWFkYXB0ZXItPnN0YXRzLmljdHhxbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUU1UQyk7CisJCWFkYXB0ZXItPnN0YXRzLmljcnhkbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYRE1UQyk7CisJfQogCiAJLyogRmlsbCBvdXQgdGhlIE9TIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCiAKQEAgLTIyMTMsOSArMjU0OSw5IEBACiAKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucnhlcnJjICsKIAkJYWRhcHRlci0+c3RhdHMuY3JjZXJycyArIGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICsKLQkJYWRhcHRlci0+c3RhdHMucmxlYyArIGFkYXB0ZXItPnN0YXRzLnJuYmMgKwotCQlhZGFwdGVyLT5zdGF0cy5tcGMgKyBhZGFwdGVyLT5zdGF0cy5jZXh0ZXJyOwotCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkID0gYWRhcHRlci0+c3RhdHMucm5iYzsKKwkJYWRhcHRlci0+c3RhdHMucmxlYyArIGFkYXB0ZXItPnN0YXRzLm1wYyArIAorCQlhZGFwdGVyLT5zdGF0cy5jZXh0ZXJyOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkID0gYWRhcHRlci0+c3RhdHMubXBjOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucmxlYzsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmNyY2VycnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjOwpAQCAtMjMwMCwxMSArMjYzNiwxMSBAQAogCSovCiAJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMil7CiAJCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOwotCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIH4wKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIH4wKTsKIAl9CiAKIAlmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQVhfSU5UUjsgaSsrKQotCQlpZih1bmxpa2VseSghZTEwMDBfY2xlYW5fcnhfaXJxKGFkYXB0ZXIpICYKKwkJaWYodW5saWtlbHkoIWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIpICYKIAkJICAgIWUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyKSkpCiAJCQlicmVhazsKIApAQCAtMjMyOCwxNiArMjY2NCwxNSBAQAogCWludCB3b3JrX3RvX2RvID0gbWluKCpidWRnZXQsIG5ldGRldi0+cXVvdGEpOwogCWludCB0eF9jbGVhbmVkOwogCWludCB3b3JrX2RvbmUgPSAwOwotCQorCiAJdHhfY2xlYW5lZCA9IGUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyKTsKLQllMTAwMF9jbGVhbl9yeF9pcnEoYWRhcHRlciwgJndvcmtfZG9uZSwgd29ya190b19kbyk7CisJYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgJndvcmtfZG9uZSwgd29ya190b19kbyk7CiAKIAkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKIAluZXRkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKIAkKLQkvKiBpZiBubyBUeCBhbmQgbm90IGVub3VnaCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwotCWlmKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lIDwgd29ya190b19kbykpIHx8IAotCQkJCSFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkvKiBJZiBubyBUeCBhbmQgbm8gUnggd29yayBkb25lLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KKwlpZiAoKCF0eF9jbGVhbmVkICYmICh3b3JrX2RvbmUgPT0gMCkpIHx8ICFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAkJcmV0dXJuIDA7CkBAIC0yMzY3LDExICsyNzAyLDEwIEBACiAJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOwogCiAJd2hpbGUoZW9wX2Rlc2MtPnVwcGVyLmRhdGEgJiBjcHVfdG9fbGUzMihFMTAwMF9UWERfU1RBVF9ERCkpIHsKLQkJLyogcHJlLW1hdHVyZSB3cml0ZWJhY2sgb2YgVHggZGVzY3JpcHRvcnMgICAgICovCi0JCS8qIGNsZWFyIChmcmVlIGJ1ZmZlcnMgYW5kIHVubWFwIHBjaV9tYXBwaW5nKSAqLwotCQkvKiBwcmV2aW91c19idWZmZXJfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogUHJlbWF0dXJlIHdyaXRlYmFjayBvZiBUeCBkZXNjcmlwdG9ycyBjbGVhciAoZnJlZSBidWZmZXJzCisJCSAqIGFuZCB1bm1hcCBwY2lfbWFwcGluZykgcHJldmlvdXNfYnVmZmVyX2luZm8gKi8KIAkJaWYgKGxpa2VseShhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mby5za2IgIT0gTlVMTCkpIHsKLQkJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIAorCQkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwKIAkJCQkJJmFkYXB0ZXItPnByZXZpb3VzX2J1ZmZlcl9pbmZvKTsKIAkJfQogCkBAIC0yMzgwLDI2ICsyNzE0LDMwIEBACiAJCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOwogCi0JCQkvKiBwcmUtbWF0dXJlIHdyaXRlYmFjayBvZiBUeCBkZXNjcmlwdG9ycyAqLwotCQkJLyogc2F2ZSB0aGUgY2xlYW5pbmcgb2YgdGhlIHRoaXMgZm9yIHRoZSAgKi8KLQkJCS8qIG5leHQgaXRlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQlpZiAoY2xlYW5lZCkgewotCQkJCW1lbWNweSgmYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8sCi0JCQkJCWJ1ZmZlcl9pbmZvLAotCQkJCQlzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikpOwotCQkJCW1lbXNldChidWZmZXJfaW5mbywKLQkJCQkJMCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpKTsKKyNpZmRlZiBORVRJRl9GX1RTTworCQkJaWYgKCEobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVFNPKSkgeworI2VuZGlmCisJCQkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaW5mbyk7CisjaWZkZWYgTkVUSUZfRl9UU08KIAkJCX0gZWxzZSB7Ci0JCQkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgCi0JCQkJCQkJYnVmZmVyX2luZm8pOworCQkJCWlmIChjbGVhbmVkKSB7CisJCQkJCW1lbWNweSgmYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8sCisJCQkJCSAgICAgICBidWZmZXJfaW5mbywKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSk7CisJCQkJCW1lbXNldChidWZmZXJfaW5mbywgMCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoCisJCQkJCSAgICBhZGFwdGVyLCBidWZmZXJfaW5mbyk7CisJCQkJfQogCQkJfQorI2VuZGlmCiAKIAkJCXR4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gMDsKIAkJCXR4X2Rlc2MtPmxvd2VyLmRhdGEgPSAwOwogCQkJdHhfZGVzYy0+dXBwZXIuZGF0YSA9IDA7CiAKLQkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOwogCQkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCX0KIAkJCkBAIC0yNDE2LDU3ICsyNzU0LDEwNyBAQAogCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CiAKIAlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfbG9jayk7Ci0gCiAJaWYoYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcpIHsKLQkJLyogZGV0ZWN0IGEgdHJhbnNtaXQgaGFuZyBpbiBoYXJkd2FyZSwgdGhpcyBzZXJpYWxpemVzIHRoZQorCisJCS8qIERldGVjdCBhIHRyYW5zbWl0IGhhbmcgaW4gaGFyZHdhcmUsIHRoaXMgc2VyaWFsaXplcyB0aGUKIAkJICogY2hlY2sgd2l0aCB0aGUgY2xlYXJpbmcgb2YgdGltZV9zdGFtcCBhbmQgbW92ZW1lbnQgb2YgaSAqLwogCQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IEZBTFNFOwotCQlpZih0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKLQkJICAgdGltZV9hZnRlcihqaWZmaWVzLCB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS50aW1lX3N0YW1wICsgSFopICYmCi0JCSAgICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX1RYT0ZGKSkKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQl9CisJCWlmICh0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgdHhfcmluZy0+YnVmZmVyX2luZm9baV0udGltZV9zdGFtcCArIEhaKQorCQkgICAgJiYgIShFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJgorCQkJRTEwMDBfU1RBVFVTX1RYT0ZGKSkgewogCisJCQkvKiBkZXRlY3RlZCBUeCB1bml0IGhhbmcgKi8KKwkJCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOworCQkJZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKKwkJCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKKwkJCURQUklOVEsoVFhfRVJSLCBFUlIsICJEZXRlY3RlZCBUeCBVbml0IEhhbmdcbiIKKwkJCQkJIiAgVERIICAgICAgICAgICAgICAgICAgPCV4PlxuIgorCQkJCQkiICBURFQgICAgICAgICAgICAgICAgICA8JXg+XG4iCisJCQkJCSIgIG5leHRfdG9fdXNlICAgICAgICAgIDwleD5cbiIKKwkJCQkJIiAgbmV4dF90b19jbGVhbiAgICAgICAgPCV4PlxuIgorCQkJCQkiYnVmZmVyX2luZm9bbmV4dF90b19jbGVhbl1cbiIKKwkJCQkJIiAgZG1hICAgICAgICAgICAgICAgICAgPCVsbHg+XG4iCisJCQkJCSIgIHRpbWVfc3RhbXAgICAgICAgICAgIDwlbHg+XG4iCisJCQkJCSIgIG5leHRfdG9fd2F0Y2ggICAgICAgIDwleD5cbiIKKwkJCQkJIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIKKwkJCQkJIiAgbmV4dF90b193YXRjaC5zdGF0dXMgPCV4PlxuIiwKKwkJCQlFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRESCksCisJCQkJRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBURFQpLAorCQkJCXR4X3JpbmctPm5leHRfdG9fdXNlLAorCQkJCWksCisJCQkJdHhfcmluZy0+YnVmZmVyX2luZm9baV0uZG1hLAorCQkJCXR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnRpbWVfc3RhbXAsCisJCQkJZW9wLAorCQkJCWppZmZpZXMsCisJCQkJZW9wX2Rlc2MtPnVwcGVyLmZpZWxkcy5zdGF0dXMpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJfQorI2lmZGVmIE5FVElGX0ZfVFNPCisKKwlpZiggdW5saWtlbHkoIShlb3BfZGVzYy0+dXBwZXIuZGF0YSAmIGNwdV90b19sZTMyKEUxMDAwX1RYRF9TVEFUX0REKSkgJiYKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mby50aW1lX3N0YW1wICsgSFopKSkKKwkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoCisJCSAgICBhZGFwdGVyLCAmYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8pOworCisjZW5kaWYKIAlyZXR1cm4gY2xlYW5lZDsKIH0KIAogLyoqCiAgKiBlMTAwMF9yeF9jaGVja3N1bSAtIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgODI1NDMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICogQHJ4X2Rlc2M6IHJlY2VpdmUgZGVzY3JpcHRvcgotICogQHNrX2J1ZmY6IHNvY2tldCBidWZmZXIgd2l0aCByZWNlaXZlZCBkYXRhCisgKiBAYWRhcHRlcjogICAgIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAc3RhdHVzX2VycjogIHJlY2VpdmUgZGVzY3JpcHRvciBzdGF0dXMgYW5kIGVycm9yIGZpZWxkcworICogQGNzdW06ICAgICAgICByZWNlaXZlIGRlc2NyaXB0b3IgY3N1bSBmaWVsZAorICogQHNrX2J1ZmY6ICAgICBzb2NrZXQgYnVmZmVyIHdpdGggcmVjZWl2ZWQgZGF0YQogICoqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDAwX3J4X2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2MsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgIHVpbnQzMl90IHN0YXR1c19lcnIsIHVpbnQzMl90IGNzdW0sCisJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwl1aW50MTZfdCBzdGF0dXMgPSAodWludDE2X3Qpc3RhdHVzX2VycjsKKwl1aW50OF90IGVycm9ycyA9ICh1aW50OF90KShzdGF0dXNfZXJyID4+IDI0KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKIAkvKiA4MjU0MyBvciBuZXdlciBvbmx5ICovCi0JaWYodW5saWtlbHkoKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHx8CisJaWYodW5saWtlbHkoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykpIHJldHVybjsKIAkvKiBJZ25vcmUgQ2hlY2tzdW0gYml0IGlzIHNldCAqLwotCShyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9JWFNNKSB8fAotCS8qIFRDUCBDaGVja3N1bSBoYXMgbm90IGJlZW4gY2FsY3VsYXRlZCAqLwotCSghKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1RDUENTKSkpKSB7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlpZih1bmxpa2VseShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9JWFNNKSkgcmV0dXJuOworCS8qIFRDUC9VRFAgY2hlY2tzdW0gZXJyb3IgYml0IGlzIHNldCAqLworCWlmKHVubGlrZWx5KGVycm9ycyAmIEUxMDAwX1JYRF9FUlJfVENQRSkpIHsKKwkJLyogbGV0IHRoZSBzdGFjayB2ZXJpZnkgY2hlY2tzdW0gZXJyb3JzICovCisJCWFkYXB0ZXItPmh3X2NzdW1fZXJyKys7CiAJCXJldHVybjsKIAl9Ci0KLQkvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIGhhcmR3YXJlIGRpZCB0aGUgVENQIGNoZWNrc3VtICovCi0JLyogbm93IGxvb2sgYXQgdGhlIFRDUCBjaGVja3N1bSBlcnJvciBiaXQgKi8KLQlpZihyeF9kZXNjLT5lcnJvcnMgJiBFMTAwMF9SWERfRVJSX1RDUEUpIHsKLQkJLyogbGV0IHRoZSBzdGFjayB2ZXJpZnkgY2hlY2tzdW0gZXJyb3JzICovCi0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkJYWRhcHRlci0+aHdfY3N1bV9lcnIrKzsKKwkvKiBUQ1AvVURQIENoZWNrc3VtIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkICovCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwkJaWYoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpCisJCQlyZXR1cm47CiAJfSBlbHNlIHsKKwkJaWYoIShzdGF0dXMgJiAoRTEwMDBfUlhEX1NUQVRfVENQQ1MgfCBFMTAwMF9SWERfU1RBVF9VRFBDUykpKQorCQkJcmV0dXJuOworCX0KKwkvKiBJdCBtdXN0IGJlIGEgVENQIG9yIFVEUCBwYWNrZXQgd2l0aCBhIHZhbGlkIGNoZWNrc3VtICovCisJaWYgKGxpa2VseShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpIHsKIAkJLyogVENQIGNoZWNrc3VtIGlzIGdvb2QgKi8KIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisJCS8qIElQIGZyYWdtZW50IHdpdGggVURQIHBheWxvYWQgKi8KKwkJLyogSGFyZHdhcmUgY29tcGxlbWVudHMgdGhlIHBheWxvYWQgY2hlY2tzdW0sIHNvIHdlIHVuZG8gaXQKKwkJICogYW5kIHRoZW4gcHV0IHRoZSB2YWx1ZSBpbiBob3N0IG9yZGVyIGZvciBmdXJ0aGVyIHN0YWNrIHVzZS4KKwkJICovCisJCWNzdW0gPSBudG9obChjc3VtIF4gMHhGRkZGKTsKKwkJc2tiLT5jc3VtID0gY3N1bTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKIAl9CisJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7CiB9CiAKIC8qKgotICogZTEwMDBfY2xlYW5fcnhfaXJxIC0gU2VuZCByZWNlaXZlZCBkYXRhIHVwIHRoZSBuZXR3b3JrIHN0YWNrCisgKiBlMTAwMF9jbGVhbl9yeF9pcnEgLSBTZW5kIHJlY2VpdmVkIGRhdGEgdXAgdGhlIG5ldHdvcmsgc3RhY2s7IGxlZ2FjeQogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCiAKQEAgLTI1MTMsNyArMjkwMSw3IEBACiAJCWlmKHVubGlrZWx5KCEocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfRU9QKSkpIHsKIAkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLwogCQkJRTEwMDBfREJHKCIlczogUmVjZWl2ZSBwYWNrZXQgY29uc3VtZWQgbXVsdGlwbGUiCi0JCQkJCSIgYnVmZmVyc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCQkgICIgYnVmZmVyc1xuIiwgbmV0ZGV2LT5uYW1lKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlnb3RvIG5leHRfZGVzYzsKIAkJfQpAQCAtMjUzOSwxNSArMjkyNywxNyBAQAogCQlza2JfcHV0KHNrYiwgbGVuZ3RoIC0gRVRIRVJORVRfRkNTX1NJWkUpOwogCiAJCS8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCAqLwotCQllMTAwMF9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IpOwotCisJCWUxMDAwX3J4X2NoZWNrc3VtKGFkYXB0ZXIsCisJCQkJICAodWludDMyX3QpKHJ4X2Rlc2MtPnN0YXR1cykgfAorCQkJCSAgKCh1aW50MzJfdCkocnhfZGVzYy0+ZXJyb3JzKSA8PCAyNCksCisJCQkJICByeF9kZXNjLT5jc3VtLCBza2IpOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmCiAJCQkgICAgKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKIAkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAotCQkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCi0JCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKKwkJCQkJCSBsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCisJCQkJCQkgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOwogCQl9IGVsc2UgewogCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJfQpAQCAtMjU3MCwxNiArMjk2MCwxNDIgQEAKIAogCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CiAJfQotCiAJcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7Ci0KLQllMTAwMF9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIpOworCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyKTsKIAogCXJldHVybiBjbGVhbmVkOwogfQogCiAvKioKLSAqIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMgLSBSZXBsYWNlIHVzZWQgcmVjZWl2ZSBidWZmZXJzCisgKiBlMTAwMF9jbGVhbl9yeF9pcnFfcHMgLSBTZW5kIHJlY2VpdmVkIGRhdGEgdXAgdGhlIG5ldHdvcmsgc3RhY2s7IHBhY2tldCBzcGxpdAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorZTEwMDBfY2xlYW5fcnhfaXJxX3BzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBpbnQgKndvcmtfZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd29ya190b19kbykKKyNlbHNlCitlMTAwMF9jbGVhbl9yeF9pcnFfcHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJdW5pb24gZTEwMDBfcnhfZGVzY19wYWNrZXRfc3BsaXQgKnJ4X2Rlc2M7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IGUxMDAwX3BzX3BhZ2UgKnBzX3BhZ2U7CisJc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hICpwc19wYWdlX2RtYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBpLCBqOworCXVpbnQzMl90IGxlbmd0aCwgc3RhdGVycjsKKwlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCisJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOworCXN0YXRlcnIgPSByeF9kZXNjLT53Yi5taWRkbGUuc3RhdHVzX2Vycm9yOworCisJd2hpbGUoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0REKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07CisJCXBzX3BhZ2VfZG1hID0gJnJ4X3JpbmctPnBzX3BhZ2VfZG1hW2ldOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJCWlmKHVubGlrZWx5KCp3b3JrX2RvbmUgPj0gd29ya190b19kbykpCisJCQlicmVhazsKKwkJKCp3b3JrX2RvbmUpKys7CisjZW5kaWYKKwkJY2xlYW5lZCA9IFRSVUU7CisJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOworCisJCWlmKHVubGlrZWx5KCEoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0VPUCkpKSB7CisJCQlFMTAwMF9EQkcoIiVzOiBQYWNrZXQgU3BsaXQgYnVmZmVycyBkaWRuJ3QgcGljayB1cCIKKwkJCQkgICIgdGhlIGZ1bGwgcGFja2V0XG4iLCBuZXRkZXYtPm5hbWUpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWdvdG8gbmV4dF9kZXNjOworCQl9CisKKwkJaWYodW5saWtlbHkoc3RhdGVyciAmIEUxMDAwX1JYREVYVF9FUlJfRlJBTUVfRVJSX01BU0spKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJZ290byBuZXh0X2Rlc2M7CisJCX0KKworCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUubGVuZ3RoMCk7CisKKwkJaWYodW5saWtlbHkoIWxlbmd0aCkpIHsKKwkJCUUxMDAwX0RCRygiJXM6IExhc3QgcGFydCBvZiB0aGUgcGFja2V0IHNwYW5uaW5nIgorCQkJCSAgIiBtdWx0aXBsZSBkZXNjcmlwdG9yc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlnb3RvIG5leHRfZGVzYzsKKwkJfQorCisJCS8qIEdvb2QgUmVjZWl2ZSAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQlmb3IoaiA9IDA7IGogPCBQU19QQUdFX0JVRkZFUlM7IGorKykgeworCQkJaWYoIShsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGhbal0pKSkKKwkJCQlicmVhazsKKworCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdLAorCQkJCQlQQUdFX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0gPSAwOworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXS5wYWdlID0KKwkJCQlwc19wYWdlLT5wc19wYWdlW2pdOworCQkJcHNfcGFnZS0+cHNfcGFnZVtqXSA9IE5VTEw7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2pdLnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal0uc2l6ZSA9IGxlbmd0aDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MrKzsKKwkJCXNrYi0+bGVuICs9IGxlbmd0aDsKKwkJCXNrYi0+ZGF0YV9sZW4gKz0gbGVuZ3RoOworCQl9CisKKwkJZTEwMDBfcnhfY2hlY2tzdW0oYWRhcHRlciwgc3RhdGVyciwKKwkJCQkgIHJ4X2Rlc2MtPndiLmxvd2VyLmhpX2R3b3JkLmNzdW1faXAuY3N1bSwgc2tiKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKworI2lmZGVmIEhBVkVfUlhfWkVST19DT1BZCisJCWlmKGxpa2VseShyeF9kZXNjLT53Yi51cHBlci5oZWFkZXJfc3RhdHVzICYKKwkJCSAgRTEwMDBfUlhEUFNfSERSU1RBVF9IRFJTUCkpCisJCQlza2Jfc2hpbmZvKHNrYiktPnplcm9fY29weSA9IFRSVUU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCQlpZih1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAorCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuICYKKwkJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCX0KKyNlbHNlIC8qIENPTkZJR19FMTAwMF9OQVBJICovCisJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfVlApKSkgeworCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYWRhcHRlci0+dmxncnAsCisJCQkJbGUxNl90b19jcHUocnhfZGVzYy0+d2IubWlkZGxlLnZsYW4gJgorCQkJCQlFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSykpOworCQl9IGVsc2UgeworCQkJbmV0aWZfcngoc2tiKTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19FMTAwMF9OQVBJICovCisJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKK25leHRfZGVzYzoKKwkJcnhfZGVzYy0+d2IubWlkZGxlLnN0YXR1c19lcnJvciAmPSB+MHhGRjsKKwkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCWlmKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpIGkgPSAwOworCisJCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDX1BTKCpyeF9yaW5nLCBpKTsKKwkJc3RhdGVyciA9IHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3I7CisJfQorCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOworCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyKTsKKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMgLSBSZXBsYWNlIHVzZWQgcmVjZWl2ZSBidWZmZXJzOyBsZWdhY3kgJiBleHRlbmRlZAogICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KIApAQCAtMjU5Miw0MyArMzEwOCw0MyBAQAogCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9kZXNjOwogCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgaW50IGksIGJ1ZnN6OworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBidWZzeiA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gKyBORVRfSVBfQUxJR047CiAKIAlpID0gcnhfcmluZy0+bmV4dF90b191c2U7CiAJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAKIAl3aGlsZSghYnVmZmVyX2luZm8tPnNrYikgewotCQlidWZzeiA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gKyBORVRfSVBfQUxJR047Ci0KIAkJc2tiID0gZGV2X2FsbG9jX3NrYihidWZzeik7CisKIAkJaWYodW5saWtlbHkoIXNrYikpIHsKIAkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQgKi8KIAkJCWJyZWFrOwogCQl9CiAKLQkJLyogZml4IGZvciBlcnJhdGEgMjMsIGNhbnQgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLworCQkvKiBGaXggZm9yIGVycmF0YSAyMywgY2FuJ3QgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLwogCQlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCBza2ItPmRhdGEsIGJ1ZnN6KSkgewogCQkJc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiA9IHNrYjsKLQkJCURQUklOVEsoUlhfRVJSLEVSUiwKLQkJCQkic2tiIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCi0JCQkJYnVmc3osIHNrYi0+ZGF0YSk7Ci0JCQkvKiB0cnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KKwkJCURQUklOVEsoUlhfRVJSLCBFUlIsICJza2IgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyAiCisJCQkJCSAgICAgImF0ICVwXG4iLCBidWZzeiwgc2tiLT5kYXRhKTsKKwkJCS8qIFRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLwogCQkJc2tiID0gZGV2X2FsbG9jX3NrYihidWZzeik7CisJCQkvKiBGYWlsZWQgYWxsb2NhdGlvbiwgY3JpdGljYWwgZmFpbHVyZSAqLwogCQkJaWYgKCFza2IpIHsKIAkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHNrYi0+ZGF0YSwgYnVmc3opKSB7CiAJCQkJLyogZ2l2ZSB1cCAqLwogCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CiAJCQkJYnJlYWs7IC8qIHdoaWxlICFidWZmZXJfaW5mby0+c2tiICovCiAJCQl9IGVsc2UgewotCQkJCS8qIG1vdmUgb24gd2l0aCB0aGUgbmV3IG9uZSAqLworCQkJCS8qIFVzZSBuZXcgYWxsb2NhdGlvbiAqLwogCQkJCWRldl9rZnJlZV9za2Iob2xkc2tiKTsKIAkJCX0KIAkJfQotCiAJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKIAkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKIAkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCkBAIC0yNjQ0LDI1ICszMTYwLDIzIEBACiAJCQkJCQkgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sCiAJCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJLyogZml4IGZvciBlcnJhdGEgMjMsIGNhbnQgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLwotCQlpZighZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbikpIHsKLQkJCURQUklOVEsoUlhfRVJSLEVSUiwKLQkJCQkiZG1hIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJWxkXG4iLAotCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sICh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEpOwotCisJCS8qIEZpeCBmb3IgZXJyYXRhIDIzLCBjYW4ndCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCisJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsCisJCQkJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbikpIHsKKwkJCURQUklOVEsoUlhfRVJSLCBFUlIsCisJCQkJImRtYSBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAorCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sCisJCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylidWZmZXJfaW5mby0+ZG1hKTsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwogCi0JCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsCi0JCQkJCSBidWZmZXJfaW5mby0+ZG1hLAorCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAogCQkJCQkgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCWJyZWFrOyAvKiB3aGlsZSAhYnVmZmVyX2luZm8tPnNrYiAqLwogCQl9Ci0KIAkJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOwogCQlyeF9kZXNjLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOwogCkBAIC0yNjcyLDcgKzMxODYsNiBAQAogCQkJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKIAkJCSAqIHN1Y2ggYXMgSUEtNjQpLiAqLwogCQkJd21iKCk7Ci0KIAkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgaSk7CiAJCX0KIApAQCAtMjY4NCw2ICszMTk3LDk1IEBACiB9CiAKIC8qKgorICogZTEwMDBfYWxsb2NfcnhfYnVmZmVyc19wcyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnM7IHBhY2tldCBzcGxpdAorICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX2FsbG9jX3J4X2J1ZmZlcnNfcHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0ICpyeF9kZXNjOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBlMTAwMF9wc19wYWdlICpwc19wYWdlOworCXN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSAqcHNfcGFnZV9kbWE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07CisJcHNfcGFnZV9kbWEgPSAmcnhfcmluZy0+cHNfcGFnZV9kbWFbaV07CisKKwl3aGlsZSghYnVmZmVyX2luZm8tPnNrYikgeworCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQ19QUygqcnhfcmluZywgaSk7CisKKwkJZm9yKGogPSAwOyBqIDwgUFNfUEFHRV9CVUZGRVJTOyBqKyspIHsKKwkJCWlmKHVubGlrZWx5KCFwc19wYWdlLT5wc19wYWdlW2pdKSkgeworCQkJCXBzX3BhZ2UtPnBzX3BhZ2Vbal0gPQorCQkJCQlhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQkJCWlmKHVubGlrZWx5KCFwc19wYWdlLT5wc19wYWdlW2pdKSkKKwkJCQkJZ290byBub19idWZmZXJzOworCQkJCXBzX3BhZ2VfZG1hLT5wc19wYWdlX2RtYVtqXSA9CisJCQkJCXBjaV9tYXBfcGFnZShwZGV2LAorCQkJCQkJICAgICBwc19wYWdlLT5wc19wYWdlW2pdLAorCQkJCQkJICAgICAwLCBQQUdFX1NJWkUsCisJCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9CisJCQkvKiBSZWZyZXNoIHRoZSBkZXNjIGV2ZW4gaWYgYnVmZmVyX2FkZHJzIGRpZG4ndAorCQkJICogY2hhbmdlIGJlY2F1c2UgZWFjaCB3cml0ZS1iYWNrIGVyYXNlcyB0aGlzIGluZm8uCisJCQkgKi8KKwkJCXJ4X2Rlc2MtPnJlYWQuYnVmZmVyX2FkZHJbaisxXSA9CisJCQkJY3B1X3RvX2xlNjQocHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdKTsKKwkJfQorCisJCXNrYiA9IGRldl9hbGxvY19za2IoYWRhcHRlci0+cnhfcHNfYnNpemUwICsgTkVUX0lQX0FMSUdOKTsKKworCQlpZih1bmxpa2VseSghc2tiKSkKKwkJCWJyZWFrOworCisJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKKwkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKKwkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCisJCSAqLworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwkJc2tiLT5kZXYgPSBuZXRkZXY7CisKKwkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X3BzX2JzaXplMDsKKwkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCSAgYWRhcHRlci0+cnhfcHNfYnNpemUwLAorCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJ4X2Rlc2MtPnJlYWQuYnVmZmVyX2FkZHJbMF0gPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKworCQlpZih1bmxpa2VseSgoaSAmIH4oRTEwMDBfUlhfQlVGRkVSX1dSSVRFIC0gMSkpID09IGkpKSB7CisJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCQkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCisJCQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkJCXdtYigpOworCQkJLyogSGFyZHdhcmUgaW5jcmVtZW50cyBieSAxNiBieXRlcywgYnV0IHBhY2tldCBzcGxpdAorCQkJICogZGVzY3JpcHRvcnMgYXJlIDMyIGJ5dGVzLi4uc28gd2UgaW5jcmVtZW50IHRhaWwKKwkJCSAqIHR3aWNlIGFzIG11Y2guCisJCQkgKi8KKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgaTw8MSk7CisJCX0KKworCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCXBzX3BhZ2UgPSAmcnhfcmluZy0+cHNfcGFnZVtpXTsKKwkJcHNfcGFnZV9kbWEgPSAmcnhfcmluZy0+cHNfcGFnZV9kbWFbaV07CisJfQorCitub19idWZmZXJzOgorCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKK30KKworLyoqCiAgKiBlMTAwMF9zbWFydHNwZWVkIC0gV29ya2Fyb3VuZCBmb3IgU21hcnRTcGVlZCBvbiA4MjU0MSBhbmQgODI1NDcgY29udHJvbGxlcnMuCiAgKiBAYWRhcHRlcjoKICAqKi8KQEAgLTI4NTYsOSArMzQ1OCwxMCBAQAogZTEwMDBfcGNpX3NldF9td2koc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCWludCByZXRfdmFsID0gcGNpX3NldF9td2koYWRhcHRlci0+cGRldik7CiAKLQlpbnQgcmV0OwotCXJldCA9IHBjaV9zZXRfbXdpKGFkYXB0ZXItPnBkZXYpOworCWlmKHJldF92YWwpCisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVycm9yIGluIHNldHRpbmcgTVdJXG4iKTsKIH0KIAogdm9pZApAQCAtMjkxNyw2ICszNTIwLDcgQEAKIAkJcmN0bCB8PSBFMTAwMF9SQ1RMX1ZGRTsKIAkJcmN0bCAmPSB+RTEwMDBfUkNUTF9DRklFTjsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7CisJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKIAl9IGVsc2UgewogCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwogCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKQEAgLTI5MjcsNiArMzUzMSwxMCBAQAogCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKIAkJcmN0bCAmPSB+RTEwMDBfUkNUTF9WRkU7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCQlpZihhZGFwdGVyLT5tbmdfdmxhbl9pZCAhPSAodWludDE2X3QpRTEwMDBfTU5HX1ZMQU5fTk9ORSkgeworCQkJZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChuZXRkZXYsIGFkYXB0ZXItPm1uZ192bGFuX2lkKTsKKwkJCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKKwkJfQogCX0KIAogCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CkBAIC0yOTM3LDcgKzM1NDUsMTAgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKIAl1aW50MzJfdCB2ZnRhLCBpbmRleDsKLQorCWlmKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCisJCUUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSAmJgorCQkodmlkID09IGFkYXB0ZXItPm1uZ192bGFuX2lkKSkKKwkJcmV0dXJuOwogCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCiAJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKIAl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CkBAIC0yOTU4LDYgKzM1NjksMTAgQEAKIAogCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiAKKwlpZigoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgorCQlFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKKwkJKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpCisJCXJldHVybjsKIAkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlICovCiAJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKIAl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CkBAIC0zMDA0LDggKzM2MTksNyBAQAogCQlicmVhazsKIAljYXNlIFNQRUVEXzEwMDAgKyBEVVBMRVhfSEFMRjogLyogbm90IHN1cHBvcnRlZCAqLwogCWRlZmF1bHQ6Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgCi0JCQkiVW5zdXBwb3J0ZWQgU3BlZWQvRHVwbGV4aXR5IGNvbmZpZ3VyYXRpb25cbiIpOworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJVbnN1cHBvcnRlZCBTcGVlZC9EdXBsZXggY29uZmlndXJhdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMwMzMsNyArMzY0Nyw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKLQl1aW50MzJfdCBjdHJsLCBjdHJsX2V4dCwgcmN0bCwgbWFuYywgc3RhdHVzOworCXVpbnQzMl90IGN0cmwsIGN0cmxfZXh0LCByY3RsLCBtYW5jLCBzdGF0dXMsIHN3c207CiAJdWludDMyX3Qgd3VmYyA9IGFkYXB0ZXItPndvbDsKIAogCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKQEAgLTMwNzUsNiArMzY4OSw5IEBACiAJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCwgY3RybF9leHQpOwogCQl9CiAKKwkJLyogQWxsb3cgdGltZSBmb3IgcGVuZGluZyBtYXN0ZXIgcmVxdWVzdHMgdG8gcnVuICovCisJCWUxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyKCZhZGFwdGVyLT5odyk7CisKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VDLCBFMTAwMF9XVUNfUE1FX0VOKTsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VGQywgd3VmYyk7CiAJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKQEAgLTMwOTksNiArMzcxNiwxNiBAQAogCQl9CiAJfQogCisJc3dpdGNoKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU3MzoKKwkJc3dzbSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1dTTSk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNXU00sCisJCQkJc3dzbSAmIH5FMTAwMF9TV1NNX0RSVl9MT0FEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJc3RhdGUgPSAoc3RhdGUgPiAwKSA/IDMgOiAwOwpAQCAtMzExMywxMyArMzc0MCwxMiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7Ci0JdWludDMyX3QgbWFuYywgcmV0OworCXVpbnQzMl90IG1hbmMsIHJldCwgc3dzbTsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHBkZXYtPmlzX2J1c21hc3RlcikKLQkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgMywgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDQsIDApOyAvKiA0ID09IEQzIGNvbGQgKi8KQEAgLTMxMzksMTAgKzM3NjUsMTkgQEAKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgTUFOQywgbWFuYyk7CiAJfQogCisJc3dpdGNoKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU3MzoKKwkJc3dzbSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1dTTSk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNXU00sCisJCQkJc3dzbSB8IEUxMDAwX1NXU01fRFJWX0xPQUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgotCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIC8qCiAgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticwpAQCAtMzE1MCw3ICszNzg1LDcgQEAKICAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1lMTAwMF9uZXRwb2xsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorZTEwMDBfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OwogCWRpc2FibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaAppbmRleCA5NzBjNjU2Li5hYWM2NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIAotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKQEAgLTQyLDcgKzQyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2lmbmRlZiBtc2VjX2RlbGF5Ci0jZGVmaW5lIG1zZWNfZGVsYXkoeCkgbXNsZWVwKHgpCisjZGVmaW5lIG1zZWNfZGVsYXkoeCkJZG8geyBpZihpbl9pbnRlcnJ1cHQoKSkgeyBcCisJCQkJLyogRG9uJ3QgbWRlbGF5IGluIGludGVycnVwdCBjb250ZXh0ISAqLyBcCisJICAgICAgICAgICAgICAgIAlCVUcoKTsgXAorCQkJfSBlbHNlIHsgXAorCQkJCW1zbGVlcCh4KTsgXAorCQkJfSB9IHdoaWxlKDApCiAKIC8qIFNvbWUgd29ya2Fyb3VuZHMgcmVxdWlyZSBtaWxsaXNlY29uZCBkZWxheXMgYW5kIGFyZSBydW4gZHVyaW5nIGludGVycnVwdAogICogY29udGV4dC4gIE1vc3Qgbm90YWJseSwgd2hlbiBlc3RhYmxpc2hpbmcgbGluaywgdGhlIHBoeSBtYXkgbmVlZCB0d2Vha2luZwpAQCAtOTYsNiArMTAxLDI5IEBACiAgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSArIFwKICAgICAgICAgKChvZmZzZXQpIDw8IDIpKSkKIAorI2RlZmluZSBFMTAwMF9SRUFEX1JFR19BUlJBWV9EV09SRCBFMTAwMF9SRUFEX1JFR19BUlJBWQorI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQgRTEwMDBfV1JJVEVfUkVHX0FSUkFZCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHX0FSUkFZX1dPUkQoYSwgcmVnLCBvZmZzZXQsIHZhbHVlKSAoIFwKKyAgICB3cml0ZXcoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIFwKKyAgICAgICAgKCgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IEUxMDAwXyMjcmVnIDogRTEwMDBfODI1NDJfIyNyZWcpICsgXAorICAgICAgICAoKG9mZnNldCkgPDwgMSkpKSkKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFR19BUlJBWV9XT1JEKGEsIHJlZywgb2Zmc2V0KSAoIFwKKyAgICByZWFkdygoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSArIFwKKyAgICAgICAgKChvZmZzZXQpIDw8IDEpKSkKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVlfQllURShhLCByZWcsIG9mZnNldCwgdmFsdWUpICggXAorICAgIHdyaXRlYigodmFsdWUpLCAoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgIChvZmZzZXQpKSkpCisKKyNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfQVJSQVlfQllURShhLCByZWcsIG9mZnNldCkgKCBcCisgICAgcmVhZGIoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgIChvZmZzZXQpKSkKKwogI2RlZmluZSBFMTAwMF9XUklURV9GTFVTSChhKSBFMTAwMF9SRUFEX1JFRyhhLCBTVEFUVVMpCiAKICNlbmRpZiAvKiBfRTEwMDBfT1NERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCmluZGV4IGU5MTRkMDkuLjY3NjI0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIApAQCAtNDc4LDcgKzQ3OCw2IEBACiAJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzIHNldCB0byBkeW5hbWljIG1vZGVcbiIsIAogCQkJCQlvcHQubmFtZSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIC0xOgogCQkJZGVmYXVsdDoKIAkJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPml0ciwgJm9wdCwgCiAJCQkJCWFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCBjZGE0OGM1Li40ZWJjZDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtODEsNiArODEsNyBAQAogICoJCQkgICBjYXVzZSBETUEgdG8ga2ZyZWUnZCBtZW1vcnkuCiAgKgkwLjMxOiAxNCBOb3YgMjAwNDogZXRodG9vbCBzdXBwb3J0IGZvciBnZXR0aW5nL3NldHRpbmcgbGluawogICoJICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy4KKyAqCTAuMzI6IDE2IEFwciAyMDA1OiBSWF9FUlJPUjQgaGFuZGxpbmcgYWRkZWQuCiAgKgogICogS25vd24gYnVnczoKICAqIFdlIHN1c3BlY3QgdGhhdCBvbiBzb21lIGhhcmR3YXJlIG5vIFRYIGRvbmUgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgpAQCAtOTIsNyArOTMsNyBAQAogICogREVWX05FRURfVElNRVJJUlEgd2lsbCBub3QgaGFybSB5b3Ugb24gc2FuZSBoYXJkd2FyZSwgb25seSBnZW5lcmF0aW5nIGEgZmV3CiAgKiBzdXBlcmZsdW91cyB0aW1lciBpbnRlcnJ1cHRzIGZyb20gdGhlIG5pYy4KICAqLwotI2RlZmluZSBGT1JDRURFVEhfVkVSU0lPTgkJIjAuMzEiCisjZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC4zMiIKICNkZWZpbmUgRFJWX05BTUUJCQkiZm9yY2VkZXRoIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMDksNiArMTEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTAxMyw2ICsxMDE1LDU5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiB9CiAKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgbmljIG5vdGljZXMgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBhY3R1YWwgZGF0YSBsZW4gb24gdGhlCisgKiB3aXJlIGFuZCB0aGUgbGVuIGluZGljYXRlZCBpbiB0aGUgODAyIGhlYWRlcgorICovCitzdGF0aWMgaW50IG52X2dldGxlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIGludCBkYXRhbGVuKQoreworCWludCBoZHJsZW47CS8qIGxlbmd0aCBvZiB0aGUgODAyIGhlYWRlciAqLworCWludCBwcm90b2xlbjsJLyogbGVuZ3RoIGFzIHN0b3JlZCBpbiB0aGUgcHJvdG8gZmllbGQgKi8KKworCS8qIDEpIGNhbGN1bGF0ZSBsZW4gYWNjb3JkaW5nIHRvIGhlYWRlciAqLworCWlmICggKChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilwYWNrZXQpLT5oX3ZsYW5fcHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJcHJvdG9sZW4gPSBudG9ocyggKChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilwYWNrZXQpLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvICk7CisJCWhkcmxlbiA9IFZMQU5fSExFTjsKKwl9IGVsc2UgeworCQlwcm90b2xlbiA9IG50b2hzKCAoKHN0cnVjdCBldGhoZHIgKilwYWNrZXQpLT5oX3Byb3RvKTsKKwkJaGRybGVuID0gRVRIX0hMRU47CisJfQorCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X2dldGxlbjogZGF0YWxlbiAlZCwgcHJvdG9sZW4gJWQsIGhkcmxlbiAlZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGRhdGFsZW4sIHByb3RvbGVuLCBoZHJsZW4pOworCWlmIChwcm90b2xlbiA+IEVUSF9EQVRBX0xFTikKKwkJcmV0dXJuIGRhdGFsZW47IC8qIFZhbHVlIGluIHByb3RvIGZpZWxkIG5vdCBhIGxlbiwgbm8gY2hlY2tzIHBvc3NpYmxlICovCisKKwlwcm90b2xlbiArPSBoZHJsZW47CisJLyogY29uc2lzdGVuY3kgY2hlY2tzOiAqLworCWlmIChkYXRhbGVuID4gRVRIX1pMRU4pIHsKKwkJaWYgKGRhdGFsZW4gPj0gcHJvdG9sZW4pIHsKKwkJCS8qIG1vcmUgZGF0YSBvbiB3aXJlIHRoYW4gaW4gODAyIGhlYWRlciwgdHJpbSBvZgorCQkJICogYWRkaXRpb25hbCBkYXRhLgorCQkJICovCisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9nZXRsZW46IGFjY2VwdGluZyAlZCBieXRlcy5cbiIsCisJCQkJCWRldi0+bmFtZSwgcHJvdG9sZW4pOworCQkJcmV0dXJuIHByb3RvbGVuOworCQl9IGVsc2UgeworCQkJLyogbGVzcyBkYXRhIG9uIHdpcmUgdGhhbiBtZW50aW9uZWQgaW4gaGVhZGVyLgorCQkJICogRGlzY2FyZCB0aGUgcGFja2V0LgorCQkJICovCisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9nZXRsZW46IGRpc2NhcmRpbmcgbG9uZyBwYWNrZXQuXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJLyogc2hvcnQgcGFja2V0LiBBY2NlcHQgb25seSBpZiA4MDIgdmFsdWVzIGFyZSBhbHNvIHNob3J0ICovCisJCWlmIChwcm90b2xlbiA+IEVUSF9aTEVOKSB7CisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9nZXRsZW46IGRpc2NhcmRpbmcgc2hvcnQgcGFja2V0LlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9nZXRsZW46IGFjY2VwdGluZyAlZCBieXRlcy5cbiIsCisJCQkJZGV2LT5uYW1lLCBkYXRhbGVuKTsKKwkJcmV0dXJuIGRhdGFsZW47CisJfQorfQorCiBzdGF0aWMgdm9pZCBudl9yeF9wcm9jZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOwpAQCAtMTA2NCw3ICsxMTE5LDcgQEAKIAkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJZ290byBuZXh0X3BrdDsKIAkJCX0KLQkJCWlmIChGbGFncyAmIChOVl9SWF9FUlJPUjF8TlZfUlhfRVJST1IyfE5WX1JYX0VSUk9SM3xOVl9SWF9FUlJPUjQpKSB7CisJCQlpZiAoRmxhZ3MgJiAoTlZfUlhfRVJST1IxfE5WX1JYX0VSUk9SMnxOVl9SWF9FUlJPUjMpKSB7CiAJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQl9CkBAIC0xMDc4LDIyICsxMTMzLDI0IEBACiAJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQl9Ci0JCQlpZiAoRmxhZ3MgJiBOVl9SWF9FUlJPUikgewotCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycywgdGhlIHJlc3QgaXMgZmF0YWwuICovCi0JCQkJaWYgKEZsYWdzICYgTlZfUlhfRlJBTUlOR0VSUikgewotCQkJCQlpZiAoRmxhZ3MgJiBOVl9SWF9TVUJTVFJBQ1QxKSB7Ci0JCQkJCQlsZW4tLTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7CisJCQlpZiAoRmxhZ3MgJiBOVl9SWF9FUlJPUjQpIHsKKwkJCQlsZW4gPSBudl9nZXRsZW4oZGV2LCBucC0+cnhfc2tidWZmW2ldLT5kYXRhLCBsZW4pOworCQkJCWlmIChsZW4gPCAwKSB7CiAJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQl9CiAJCQl9CisJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMuICovCisJCQlpZiAoRmxhZ3MgJiBOVl9SWF9GUkFNSU5HRVJSKSB7CisJCQkJaWYgKEZsYWdzICYgTlZfUlhfU1VCU1RSQUNUMSkgeworCQkJCQlsZW4tLTsKKwkJCQl9CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoIShGbGFncyAmIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQpKQogCQkJCWdvdG8gbmV4dF9wa3Q7CiAKLQkJCWlmIChGbGFncyAmIChOVl9SWDJfRVJST1IxfE5WX1JYMl9FUlJPUjJ8TlZfUlgyX0VSUk9SM3xOVl9SWDJfRVJST1I0KSkgeworCQkJaWYgKEZsYWdzICYgKE5WX1JYMl9FUlJPUjF8TlZfUlgyX0VSUk9SMnxOVl9SWDJfRVJST1IzKSkgewogCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlnb3RvIG5leHRfcGt0OwogCQkJfQpAQCAtMTEwNywxNyArMTE2NCwxOSBAQAogCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlnb3RvIG5leHRfcGt0OwogCQkJfQotCQkJaWYgKEZsYWdzICYgTlZfUlgyX0VSUk9SKSB7Ci0JCQkJLyogZnJhbWluZyBlcnJvcnMgYXJlIHNvZnQgZXJyb3JzLCB0aGUgcmVzdCBpcyBmYXRhbC4gKi8KLQkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfRlJBTUlOR0VSUikgewotCQkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfU1VCU1RSQUNUMSkgewotCQkJCQkJbGVuLS07Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeworCQkJaWYgKEZsYWdzICYgTlZfUlgyX0VSUk9SNCkgeworCQkJCWxlbiA9IG52X2dldGxlbihkZXYsIG5wLT5yeF9za2J1ZmZbaV0tPmRhdGEsIGxlbik7CisJCQkJaWYgKGxlbiA8IDApIHsKIAkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCX0KIAkJCX0KKwkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycyAqLworCQkJaWYgKEZsYWdzICYgTlZfUlgyX0ZSQU1JTkdFUlIpIHsKKwkJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfU1VCU1RSQUNUMSkgeworCQkJCQlsZW4tLTsKKwkJCQl9CisJCQl9CiAJCQlGbGFncyAmPSBOVl9SWDJfQ0hFQ0tTVU1NQVNLOwogCQkJaWYgKEZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMSB8fAogCQkJCQlGbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzIgfHwKQEAgLTE0ODAsNiArMTUzOSwxMyBAQAogCWVuYWJsZV9pcnEoZGV2LT5pcnEpOwogfQogCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIG52X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW52X2RvX25pY19wb2xsKCh1bnNpZ25lZCBsb25nKSBkZXYpOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIG52X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOwpAQCAtMTk2Miw2ICsyMDI4LDkgQEAKIAlkZXYtPmdldF9zdGF0cyA9IG52X2dldF9zdGF0czsKIAlkZXYtPmNoYW5nZV9tdHUgPSBudl9jaGFuZ2VfbXR1OwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbnZfc2V0X211bHRpY2FzdDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gbnZfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CiAJZGV2LT50eF90aW1lb3V0ID0gbnZfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gTlZfV0FUQ0hET0dfVElNRU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKaW5kZXggYWI0NDM1OC4uNjQ4MmQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuYwpAQCAtMTU5NSw3ICsxNTk1LDcgQEAKIHN0YXRpYyBpbnQgZW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7Ci0JdWludCAqZGF0YSA9ICh1aW50ICopICYgcnEtPmlmcl9pZnJ1OworCXVpbnQxNl90ICpkYXRhID0gKHVpbnQxNl90ICopICYgcnEtPmlmcl9pZnJ1OwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHTUlJUEhZOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiLmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAppbmRleCAyNmM0ZjE1Li5mOGQzMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtMTEwLDcgKzExMCw3IEBACiAjZGVmaW5lIElYR0JfVFhfUVVFVUVfV0FLRSAxNgogCiAvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLwotI2RlZmluZSBJWEdCX1JYX0JVRkZFUl9XUklURQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgSVhHQl9SWF9CVUZGRVJfV1JJVEUJNAkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KIAogLyogb25seSB3b3JrcyBmb3Igc2l6ZXMgdGhhdCBhcmUgcG93ZXJzIG9mIDIgKi8KICNkZWZpbmUgSVhHQl9ST1VORFVQKGksIHNpemUpICgoaSkgPSAoKChpKSArIChzaXplKSAtIDEpICYgfigoc2l6ZSkgLSAxKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5jCmluZGV4IDY1M2U5OWYuLjNhYWUxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5jCkBAIC00MTEsNyArNDExLDcgQEAKIAlpeGdiX2NsZWFudXBfZWVwcm9tKGh3KTsKIAogCS8qIGNsZWFyIHRoZSBpbml0X2N0cmxfcmVnXzEgdG8gc2lnbmlmeSB0aGF0IHRoZSBjYWNoZSBpcyBpbnZhbGlkYXRlZCAqLwotCWVlX21hcC0+aW5pdF9jdHJsX3JlZ18xID0gRUVQUk9NX0lDVzFfU0lHTkFUVVJFX0NMRUFSOworCWVlX21hcC0+aW5pdF9jdHJsX3JlZ18xID0gbGUxNl90b19jcHUoRUVQUk9NX0lDVzFfU0lHTkFUVVJFX0NMRUFSKTsKIAogCXJldHVybjsKIH0KQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlERUJVR09VVCgiaXhnYl9lZTogQ2hlY2tzdW0gaW52YWxpZC5cbiIpOwogCQkvKiBjbGVhciB0aGUgaW5pdF9jdHJsX3JlZ18xIHRvIHNpZ25pZnkgdGhhdCB0aGUgY2FjaGUgaXMKIAkJICogaW52YWxpZGF0ZWQgKi8KLQkJZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgPSBFRVBST01fSUNXMV9TSUdOQVRVUkVfQ0xFQVI7CisJCWVlX21hcC0+aW5pdF9jdHJsX3JlZ18xID0gbGUxNl90b19jcHUoRUVQUk9NX0lDVzFfU0lHTkFUVVJFX0NMRUFSKTsKIAkJcmV0dXJuIChGQUxTRSk7CiAJfQogCkBAIC01NzksNyArNTc5LDcgQEAKIAlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKIAogCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKLQkJcmV0dXJuKGVlX21hcC0+Y29tcGF0aWJpbGl0eSk7CisJCXJldHVybiAobGUxNl90b19jcHUoZWVfbWFwLT5jb21wYXRpYmlsaXR5KSk7CiAKIAlyZXR1cm4oMCk7CiB9CkBAIC02MTYsNyArNjE2LDcgQEAKIAlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKIAogCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKLQkJcmV0dXJuKGVlX21hcC0+aW5pdF9jdHJsX3JlZ18xKTsKKwkJcmV0dXJuIChsZTE2X3RvX2NwdShlZV9tYXAtPmluaXRfY3RybF9yZWdfMSkpOwogCiAJcmV0dXJuKDApOwogfQpAQCAtNjM1LDcgKzYzNSw3IEBACiAJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CiAKIAlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCi0JCXJldHVybihlZV9tYXAtPmluaXRfY3RybF9yZWdfMik7CisJCXJldHVybiAobGUxNl90b19jcHUoZWVfbWFwLT5pbml0X2N0cmxfcmVnXzIpKTsKIAogCXJldHVybigwKTsKIH0KQEAgLTY1NCw3ICs2NTQsNyBAQAogCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOwogCiAJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQotCSAgIHJldHVybihlZV9tYXAtPnN1YnN5c3RlbV9pZCk7CisJCXJldHVybiAobGUxNl90b19jcHUoZWVfbWFwLT5zdWJzeXN0ZW1faWQpKTsKIAogCXJldHVybigwKTsKIH0KQEAgLTY3Myw3ICs2NzMsNyBAQAogCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOwogCiAJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQotCQlyZXR1cm4oZWVfbWFwLT5zdWJ2ZW5kb3JfaWQpOworCQlyZXR1cm4gKGxlMTZfdG9fY3B1KGVlX21hcC0+c3VidmVuZG9yX2lkKSk7CiAKIAlyZXR1cm4oMCk7CiB9CkBAIC02OTIsNyArNjkyLDcgQEAKIAlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKIAogCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKLQkJcmV0dXJuKGVlX21hcC0+ZGV2aWNlX2lkKTsKKwkJcmV0dXJuIChsZTE2X3RvX2NwdShlZV9tYXAtPmRldmljZV9pZCkpOwogCiAJcmV0dXJuKDApOwogfQpAQCAtNzExLDcgKzcxMSw3IEBACiAJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CiAKIAlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCi0JCXJldHVybihlZV9tYXAtPnZlbmRvcl9pZCk7CisJCXJldHVybiAobGUxNl90b19jcHUoZWVfbWFwLT52ZW5kb3JfaWQpKTsKIAogCXJldHVybigwKTsKIH0KQEAgLTczMCw3ICs3MzAsNyBAQAogCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOwogCiAJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQotCQlyZXR1cm4oZWVfbWFwLT5zd2RwaW5zX3JlZyk7CisJCXJldHVybiAobGUxNl90b19jcHUoZWVfbWFwLT5zd2RwaW5zX3JlZykpOwogCiAJcmV0dXJuKDApOwogfQpAQCAtNzQ5LDcgKzc0OSw3IEBACiAJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CiAKIAlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCi0JCXJldHVybihlZV9tYXAtPmQzX3Bvd2VyKTsKKwkJcmV0dXJuIChsZTE2X3RvX2NwdShlZV9tYXAtPmQzX3Bvd2VyKSk7CiAKIAlyZXR1cm4oMCk7CiB9CkBAIC03NjgsNyArNzY4LDcgQEAKIAlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKIAogCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKLQkJcmV0dXJuKGVlX21hcC0+ZDBfcG93ZXIpOworCQlyZXR1cm4gKGxlMTZfdG9fY3B1KGVlX21hcC0+ZDBfcG93ZXIpKTsKIAogCXJldHVybigwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jCmluZGV4IGFlYTEwZTguLjNmYTExMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpAQCAtMjUyLDcgKzI1Miw5IEBACiAJdWludDMyX3QgKnJlZ19zdGFydCA9IHJlZzsKIAl1aW50OF90IGk7CiAKLQlyZWdzLT52ZXJzaW9uID0gKGFkYXB0ZXItPmh3LmRldmljZV9pZCA8PCAxNikgfCBhZGFwdGVyLT5ody5zdWJzeXN0ZW1faWQ7CisJLyogdGhlIDEgKG9uZSkgYmVsb3cgaW5kaWNhdGVzIGFuIGF0dGVtcHQgYXQgdmVyc2lvbmluZywgaWYgdGhlCisJICogaW50ZXJmYWNlIGluIGV0aHRvb2wgb3IgdGhlIGRyaXZlciB0aGlzIDEgc2hvdWxkIGJlIGluY3JlbWVudGVkICovCisJcmVncy0+dmVyc2lvbiA9ICgxPDwyNCkgfCBody0+cmV2aXNpb25faWQgPDwgMTYgfCBody0+ZGV2aWNlX2lkOwogCiAJLyogR2VuZXJhbCBSZWdpc3RlcnMgKi8KIAkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMCk7CS8qICAgMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKaW5kZXggN2QyNjYyMy4uMzVmNmE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAjZWxzZQogI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKICNlbmRpZgotY2hhciBpeGdiX2RyaXZlcl92ZXJzaW9uW10gPSAiMS4wLjkwLWsyIkRSSVZFUk5BUEk7CitjaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjAuOTUtazIiRFJJVkVSTkFQSTsKIGNoYXIgaXhnYl9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCiAvKiBpeGdiX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCkBAIC0xMDMsNiArMTAzLDcgQEAKIHN0YXRpYyBpbnQgaXhnYl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApOwogc3RhdGljIGlycXJldHVybl90IGl4Z2JfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgYm9vbGVhbl90IGl4Z2JfY2xlYW5fdHhfaXJxKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworCiAjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQogc3RhdGljIGludCBpeGdiX2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KTsKIHN0YXRpYyBib29sZWFuX3QgaXhnYl9jbGVhbl9yeF9pcnEoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwKQEAgLTEyMCwzMyArMTIxLDIwIEBACiBzdGF0aWMgdm9pZCBpeGdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKIHN0YXRpYyB2b2lkIGl4Z2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCi1zdGF0aWMgaW50IGl4Z2Jfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBldmVudCwKLQkJCSAgICAgIHZvaWQgKnB0cik7Ci1zdGF0aWMgaW50IGl4Z2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpOwotCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIC8qIGZvciBuZXRkdW1wIC8gbmV0IGNvbnNvbGUgKi8KIHN0YXRpYyB2b2lkIGl4Z2JfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgogCi1zdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXhnYl9ub3RpZmllcl9yZWJvb3QgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBpeGdiX25vdGlmeV9yZWJvb3QsCi0JLm5leHQgPSBOVUxMLAotCS5wcmlvcml0eSA9IDAKLX07Ci0KIC8qIEV4cG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcyAqLwogCiBleHRlcm4gdm9pZCBpeGdiX2NoZWNrX29wdGlvbnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpeGdiX2RyaXZlciA9IHsKLQkubmFtZSA9IGl4Z2JfZHJpdmVyX25hbWUsCisJLm5hbWUgICAgID0gaXhnYl9kcml2ZXJfbmFtZSwKIAkuaWRfdGFibGUgPSBpeGdiX3BjaV90YmwsCi0JLnByb2JlID0gaXhnYl9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoaXhnYl9yZW1vdmUpLAotCS8qIFBvd2VyIE1hbmFnbWVudCBIb29rcyAqLwotCS5zdXNwZW5kID0gTlVMTCwKLQkucmVzdW1lID0gTlVMTAorCS5wcm9iZSAgICA9IGl4Z2JfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoaXhnYl9yZW1vdmUpLAogfTsKIAogTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24sIDxsaW51eC5uaWNzQGludGVsLmNvbT4iKTsKQEAgLTE2OSwxNyArMTU3LDEyIEBACiBzdGF0aWMgaW50IF9faW5pdAogaXhnYl9pbml0X21vZHVsZSh2b2lkKQogewotCWludCByZXQ7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLAogCSAgICAgICBpeGdiX2RyaXZlcl9zdHJpbmcsIGl4Z2JfZHJpdmVyX3ZlcnNpb24pOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGl4Z2JfY29weXJpZ2h0KTsKIAotCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmaXhnYl9kcml2ZXIpOwotCWlmKHJldCA+PSAwKSB7Ci0JCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaXhnYl9ub3RpZmllcl9yZWJvb3QpOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJml4Z2JfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaXhnYl9pbml0X21vZHVsZSk7CkBAIC0xOTQsNyArMTc3LDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogaXhnYl9leGl0X21vZHVsZSh2b2lkKQogewotCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpeGdiX25vdGlmaWVyX3JlYm9vdCk7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpeGdiX2RyaXZlcik7CiB9CiAKQEAgLTIyNCw4ICsyMDYsOCBAQAogewogCWlmKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFkYXB0ZXItPmlycV9zZW0pKSB7CiAJCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1TLAotCQkJICAgSVhHQl9JTlRfUlhUMCB8IElYR0JfSU5UX1JYRE1UMCB8IElYR0JfSU5UX1RYRFcgfAotCQkJICAgSVhHQl9JTlRfUlhPIHwgSVhHQl9JTlRfTFNDKTsKKwkJCSAgICAgICBJWEdCX0lOVF9SWFQwIHwgSVhHQl9JTlRfUlhETVQwIHwgSVhHQl9JTlRfVFhEVyB8CisJCQkgICAgICAgSVhHQl9JTlRfTFNDKTsKIAkJSVhHQl9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCX0KIH0KQEAgLTEyMDksMTAgKzExOTEsMTAgQEAKIAkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RTRQogCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfSVAKIAkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RDUAotCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfUlMKIAkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX0lERQogCQkJCQkJfCAoc2tiLT5sZW4gLSAoaGRyX2xlbikpKTsKIAorCiAJCWlmKCsraSA9PSBhZGFwdGVyLT50eF9yaW5nLmNvdW50KSBpID0gMDsKIAkJYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZSA9IGk7CiAKQEAgLTEyNDcsOCArMTIyOSw3IEBACiAJCWNvbnRleHRfZGVzYy0+bXNzID0gMDsKIAkJY29udGV4dF9kZXNjLT5jbWRfdHlwZV9sZW4gPQogCQkJY3B1X3RvX2xlMzIoSVhHQl9DT05URVhUX0RFU0NfVFlQRQotCQkJCQl8IElYR0JfVFhfREVTQ19DTURfUlMgCi0JCQkJCXwgSVhHQl9UWF9ERVNDX0NNRF9JREUpOworCQkJCSAgICB8IElYR0JfVFhfREVTQ19DTURfSURFKTsKIAogCQlpZigrK2kgPT0gYWRhcHRlci0+dHhfcmluZy5jb3VudCkgaSA9IDA7CiAJCWFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2UgPSBpOwpAQCAtMTI3Myw2ICsxMjU0LDcgQEAKIAogCXVuc2lnbmVkIGludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAJdW5zaWduZWQgaW50IGY7CisKIAlsZW4gLT0gc2tiLT5kYXRhX2xlbjsKIAogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKQEAgLTE1MjYsMTQgKzE1MDgsMzMgQEAKIHZvaWQKIGl4Z2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCWlmKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgIChuZXRkZXYtPm1jX2NvdW50ID4gSVhHQl9NQVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTRVMpKSB7CisJCXU2NCBtdWx0aSA9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUFJDTCk7CisJCXUzMiBiY2FzdF9sID0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNMKTsKKwkJdTMyIGJjYXN0X2ggPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQlBSQ0gpOworCQl1NjQgYmNhc3QgPSAoKHU2NCliY2FzdF9oIDw8IDMyKSB8IGJjYXN0X2w7IAorCisJCW11bHRpIHw9ICgodTY0KUlYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUFJDSCkgPDwgMzIpOworCQkvKiBmaXggdXAgbXVsdGljYXN0IHN0YXRzIGJ5IHJlbW92aW5nIGJyb2FkY2FzdHMgKi8KKwkJbXVsdGkgLT0gYmNhc3Q7CisJCQorCQlhZGFwdGVyLT5zdGF0cy5tcHJjbCArPSAobXVsdGkgJiAweEZGRkZGRkZGKTsKKwkJYWRhcHRlci0+c3RhdHMubXByY2ggKz0gKG11bHRpID4+IDMyKTsKKwkJYWRhcHRlci0+c3RhdHMuYnByY2wgKz0gYmNhc3RfbDsgCisJCWFkYXB0ZXItPnN0YXRzLmJwcmNoICs9IGJjYXN0X2g7CisJfSBlbHNlIHsKKwkJYWRhcHRlci0+c3RhdHMubXByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1QUkNMKTsKKwkJYWRhcHRlci0+c3RhdHMubXByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1QUkNIKTsKKwkJYWRhcHRlci0+c3RhdHMuYnByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNMKTsKKwkJYWRhcHRlci0+c3RhdHMuYnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNIKTsKKwl9CiAJYWRhcHRlci0+c3RhdHMudHBybCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSTCk7CiAJYWRhcHRlci0+c3RhdHMudHByaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSSCk7CiAJYWRhcHRlci0+c3RhdHMuZ3ByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdQUkNMKTsKIAlhZGFwdGVyLT5zdGF0cy5ncHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgR1BSQ0gpOwotCWFkYXB0ZXItPnN0YXRzLmJwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBCUFJDTCk7Ci0JYWRhcHRlci0+c3RhdHMuYnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNIKTsKLQlhZGFwdGVyLT5zdGF0cy5tcHJjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTVBSQ0wpOwotCWFkYXB0ZXItPnN0YXRzLm1wcmNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUFJDSCk7CiAJYWRhcHRlci0+c3RhdHMudXByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFVQUkNMKTsKIAlhZGFwdGVyLT5zdGF0cy51cHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVVBSQ0gpOwogCWFkYXB0ZXItPnN0YXRzLnZwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBWUFJDTCk7CkBAIC0xODIzLDcgKzE4MjQsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAlzdHJ1Y3QgaXhnYl9yeF9kZXNjICpyeF9kZXNjLCAqbmV4dF9yeGQ7CiAJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbywgKm5leHRfYnVmZmVyLCAqbmV4dDJfYnVmZmVyOwotCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0X3NrYjsKIAl1aW50MzJfdCBsZW5ndGg7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKQEAgLTE4MzMsNiArMTgzMyw4IEBACiAJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAKIAl3aGlsZShyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0REKSB7CisJCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0X3NrYjsKKwkJdTggc3RhdHVzOwogCiAjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQogCQlpZigqd29ya19kb25lID49IHdvcmtfdG9fZG8pCkBAIC0xODQwLDcgKzE4NDIsOSBAQAogCiAJCSgqd29ya19kb25lKSsrOwogI2VuZGlmCisJCXN0YXR1cyA9IHJ4X2Rlc2MtPnN0YXR1czsKIAkJc2tiID0gYnVmZmVyX2luZm8tPnNrYjsKKwogCQlwcmVmZXRjaChza2ItPmRhdGEpOwogCiAJCWlmKCsraSA9PSByeF9yaW5nLT5jb3VudCkgaSA9IDA7CkBAIC0xODU1LDcgKzE4NTksNiBAQAogCQluZXh0X3NrYiA9IG5leHRfYnVmZmVyLT5za2I7CiAJCXByZWZldGNoKG5leHRfc2tiKTsKIAotCiAJCWNsZWFuZWQgPSBUUlVFOwogCiAJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKQEAgLTE4NjUsNyArMTg2OCw3IEBACiAKIAkJbGVuZ3RoID0gbGUxNl90b19jcHUocnhfZGVzYy0+bGVuZ3RoKTsKIAotCQlpZih1bmxpa2VseSghKHJ4X2Rlc2MtPnN0YXR1cyAmIElYR0JfUlhfREVTQ19TVEFUVVNfRU9QKSkpIHsKKwkJaWYodW5saWtlbHkoIShzdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0VPUCkpKSB7CiAKIAkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLwogCkBAIC0xODczLDEyICsxODc2LDcgQEAKIAkJCQkJICJsZW5ndGg8JXg+XG4iLCBsZW5ndGgpOwogCiAJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJcnhfZGVzYy0+c3RhdHVzID0gMDsKLQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCi0JCQlyeF9kZXNjID0gbmV4dF9yeGQ7Ci0JCQlidWZmZXJfaW5mbyA9IG5leHRfYnVmZmVyOwotCQkJY29udGludWU7CisJCQlnb3RvIHJ4ZGVzY19kb25lOwogCQl9CiAKIAkJaWYgKHVubGlrZWx5KHJ4X2Rlc2MtPmVycm9ycwpAQCAtMTg4NywxMiArMTg4NSw3IEBACiAJCQkJSVhHQl9SWF9ERVNDX0VSUk9SU19SWEUpKSkgewogCiAJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJcnhfZGVzYy0+c3RhdHVzID0gMDsKLQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCi0JCQlyeF9kZXNjID0gbmV4dF9yeGQ7Ci0JCQlidWZmZXJfaW5mbyA9IG5leHRfYnVmZmVyOwotCQkJY29udGludWU7CisJCQlnb3RvIHJ4ZGVzY19kb25lOwogCQl9CiAKIAkJLyogR29vZCBSZWNlaXZlICovCkBAIC0xOTAzLDcgKzE4OTYsNyBAQAogCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQotCQlpZihhZGFwdGVyLT52bGdycCAmJiAocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCkpIHsKKwkJaWYoYWRhcHRlci0+dmxncnAgJiYgKHN0YXR1cyAmIElYR0JfUlhfREVTQ19TVEFUVVNfVlApKSB7CiAJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwKIAkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCiAJCQkJCUlYR0JfUlhfREVTQ19TUEVDSUFMX1ZMQU5fTUFTSyk7CkBAIC0xOTExLDcgKzE5MDQsNyBAQAogCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJfQogI2Vsc2UgLyogQ09ORklHX0lYR0JfTkFQSSAqLwotCQlpZihhZGFwdGVyLT52bGdycCAmJiAocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCkpIHsKKwkJaWYoYWRhcHRlci0+dmxncnAgJiYgKHN0YXR1cyAmIElYR0JfUlhfREVTQ19TVEFUVVNfVlApKSB7CiAJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwKIAkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCiAJCQkJCUlYR0JfUlhfREVTQ19TUEVDSUFMX1ZMQU5fTUFTSyk7CkBAIC0xOTIxLDkgKzE5MTQsMTIgQEAKICNlbmRpZiAvKiBDT05GSUdfSVhHQl9OQVBJICovCiAJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAKK3J4ZGVzY19kb25lOgorCQkvKiBjbGVhbiB1cCBkZXNjcmlwdG9yLCBtaWdodCBiZSB3cml0dGVuIG92ZXIgYnkgaHcgKi8KIAkJcnhfZGVzYy0+c3RhdHVzID0gMDsKIAkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CiAKKwkJLyogdXNlIHByZWZldGNoZWQgdmFsdWVzICovCiAJCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKIAkJYnVmZmVyX2luZm8gPSBuZXh0X2J1ZmZlcjsKIAl9CkBAIC0xOTU5LDggKzE5NTUsOCBAQAogCiAJbnVtX2dyb3VwX3RhaWxfd3JpdGVzID0gSVhHQl9SWF9CVUZGRVJfV1JJVEU7CiAKLQkvKiBsZWF2ZSBvbmUgZGVzY3JpcHRvciB1bnVzZWQgKi8KLQl3aGlsZSgtLWNsZWFuY291bnQgPiAwKSB7CisJLyogbGVhdmUgdGhyZWUgZGVzY3JpcHRvcnMgdW51c2VkICovCisJd2hpbGUoLS1jbGVhbmNvdW50ID4gMikgewogCQlyeF9kZXNjID0gSVhHQl9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gKyBORVRfSVBfQUxJR04pOwpAQCAtMTk4Nyw2ICsxOTgzLDEwIEBACiAJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQlyeF9kZXNjLT5idWZmX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKwkJLyogZ3VhcmFudGVlIEREIGJpdCBub3Qgc2V0IG5vdyBiZWZvcmUgaC93IGdldHMgZGVzY3JpcHRvcgorCQkgKiB0aGlzIGlzIHRoZSByZXN0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBoL3cgZG91YmxlIAorCQkgKiB3cml0ZWJhY2suICovCisJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CiAKIAkJaWYoKGkgJiB+KG51bV9ncm91cF90YWlsX3dyaXRlcy0gMSkpID09IGkpIHsKIAkJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CkBAIC0yMDk5LDU0ICsyMDk5LDYgQEAKIAl9CiB9CiAKLS8qKgotICogaXhnYl9ub3RpZnlfcmVib290IC0gaGFuZGxlcyBPUyBub3RpZmljYXRpb24gb2YgcmVib290IGV2ZW50LgotICogQHBhcmFtIG5iIG5vdGlmaWVyIGJsb2NrLCB1bnVzZWQKLSAqIEBwYXJhbSBldmVudCBFdmVudCBiZWluZyBwYXNzZWQgdG8gZHJpdmVyIHRvIGFjdCB1cG9uCi0gKiBAcGFyYW0gcCBBIHBvaW50ZXIgdG8gb3VyIG5ldCBkZXZpY2UKLSAqKi8KLXN0YXRpYyBpbnQKLWl4Z2Jfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQotCXN3aXRjaChldmVudCkgewotCWNhc2UgU1lTX0RPV046Ci0JY2FzZSBTWVNfSEFMVDoKLQljYXNlIFNZU19QT1dFUl9PRkY6Ci0JCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkpIHsKLQkJCWlmIChwY2lfZGV2X2RyaXZlcihwZGV2KSA9PSAmaXhnYl9kcml2ZXIpCi0JCQkJaXhnYl9zdXNwZW5kKHBkZXYsIDMpOwotCQl9Ci0JfQotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotLyoqCi0gKiBpeGdiX3N1c3BlbmQgLSBkcml2ZXIgc3VzcGVuZCBmdW5jdGlvbiBjYWxsZWQgZnJvbSBub3RpZnkuCi0gKiBAcGFyYW0gcGRldiBwY2kgZHJpdmVyIHN0cnVjdHVyZSB1c2VkIGZvciBwYXNzaW5nIHRvCi0gKiBAcGFyYW0gc3RhdGUgcG93ZXIgc3RhdGUgdG8gZW50ZXIgCi0gKiovCi1zdGF0aWMgaW50Ci1peGdiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQzMl90IHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKLQotCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKLQotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOwotCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0KLQlzdGF0ZSA9IChzdGF0ZSA+IDApID8gMyA6IDA7Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBzdGF0ZSk7Ci0JbXNlY19kZWxheSgyMDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogLyoKICAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCkBAIC0yMTU3LDYgKzIxMDksNyBAQAogc3RhdGljIHZvaWQgaXhnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwogCWRpc2FibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CiAJaXhnYl9pbnRyKGFkYXB0ZXItPnBkZXYtPmlycSwgZGV2LCBOVUxMKTsKIAllbmFibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2Jfb3NkZXAuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9vc2RlcC5oCmluZGV4IDllYmE5MjguLmRiYTIwNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9vc2RlcC5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9vc2RlcC5oCkBAIC00NSw4ICs0NSw3IEBACiAJCQkJLyogRG9uJ3QgbWRlbGF5IGluIGludGVycnVwdCBjb250ZXh0ISAqLyBcCiAJICAgICAgICAgICAgICAgIAlCVUcoKTsgXAogCQkJfSBlbHNlIHsgXAotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsgXAotCQkJCXNjaGVkdWxlX3RpbWVvdXQoKHggKiBIWikvMTAwMCArIDIpOyBcCisJCQkJbXNsZWVwKHgpOyBcCiAJCQl9IH0gd2hpbGUoMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY25ldDMyLmMgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKaW5kZXggMTc5NDdlNi4uMTNmMTE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpAQCAtMjIsOCArMjIsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgRFJWX05BTUUJInBjbmV0MzIiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIxLjMwaSIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIjA2LjI4LjIwMDQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjMwaiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjI5LjA0LjIwMDUiCiAjZGVmaW5lIFBGWAkJRFJWX05BTUUgIjogIgogCiBzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CkBAIC0yNTYsNiArMjU2LDcgQEAKICAqCSAgIGhvbWVwbmEgZm9yIHNlbGVjdGluZyBIb21lUE5BIG1vZGUgZm9yIFBDTmV0L0hvbWUgNzlDOTc4LgogICogdjEuMzBoICAyNCBKdW4gMjAwNCBEb24gRnJ5IGNvcnJlY3RseSBzZWxlY3QgYXV0bywgc3BlZWQsIGR1cGxleCBpbiBiY3IzMi4KICAqIHYxLjMwaSAgMjggSnVuIDIwMDQgRG9uIEZyeSBjaGFuZ2UgdG8gdXNlIG1vZHVsZV9wYXJhbS4KKyAqIHYxLjMwaiAgMjkgQXByIDIwMDUgRG9uIEZyeSBmaXggc2tiL21hcCBsZWFrIHdpdGggbG9vcGJhY2sgdGVzdC4KICAqLwogCiAKQEAgLTM5NSw2ICszOTYsNyBAQAogc3RhdGljIGludCBwY25ldDMyX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKIAl2b2lkICpwdHIpOworc3RhdGljIHZvaWQgcGNuZXQzMl9wdXJnZV90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBlbnVtIHBjaV9mbGFnc19iaXQgewogICAgIFBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKQEAgLTc4NSw2ICs3ODcsNyBAQAogICAgIH0KIAogY2xlYW5fdXA6CisgICAgcGNuZXQzMl9wdXJnZV90eF9yaW5nKGRldik7CiAgICAgeCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgMTUpICYgMHhGRkZGOwogICAgIGEtPndyaXRlX2Nzcihpb2FkZHIsIDE1LCAoeCAmIH4weDAwNDQpKTsJLyogcmVzZXQgYml0cyA2IGFuZCAyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggZjc5YjAyZS4uZjEwZGQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTYxLDggKzYxLDggQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJ0ZzMiCiAjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjMuMjciCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTWF5IDUsIDIwMDUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4yOSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXkgMjMsIDIwMDUiCiAKICNkZWZpbmUgVEczX0RFRl9NQUNfTU9ERQkwCiAjZGVmaW5lIFRHM19ERUZfUlhfTU9ERQkJMApAQCAtMjA2LDYgKzIwNiw4IEBACiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKIAl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTIsCiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTJNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzTSwKQEAgLTQyMCw3ICs0MjIsOCBAQAogewogCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAogCSAgICAgKHRwLT5taXNjX2hvc3RfY3RybCAmIH5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKLQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAwKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgICh0cC0+bGFzdF90YWcgPDwgMjQpKTsKIAl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CiAKIAl0ZzNfY29uZF9pbnQodHApOwpAQCAtNDU1LDEwICs0NTgsMTYgQEAKIHsKIAl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKIAkJKHRwLT5taXNjX2hvc3RfY3RybCAmIH5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKLQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAwKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5sYXN0X3RhZyA8PCAyNCk7CiAJbW1pb3diKCk7CiAKLQlpZiAodGczX2hhc193b3JrKHRwKSkKKwkvKiBXaGVuIGRvaW5nIHRhZ2dlZCBzdGF0dXMsIHRoaXMgd29yayBjaGVjayBpcyB1bm5lY2Vzc2FyeS4KKwkgKiBUaGUgbGFzdF90YWcgd2Ugd3JpdGUgYWJvdmUgdGVsbHMgdGhlIGNoaXAgd2hpY2ggcGllY2Ugb2YKKwkgKiB3b3JrIHdlJ3ZlIGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykgJiYKKwkgICAgdGczX2hhc193b3JrKHRwKSkKIAkJdHczMihIT1NUQ0NfTU9ERSwgdHAtPmNvYWxlc2NlX21vZGUgfAogCQkgICAgIChIT1NUQ0NfTU9ERV9FTkFCTEUgfCBIT1NUQ0NfTU9ERV9OT1cpKTsKIH0KQEAgLTI1MDAsNyArMjUwOSw3IEBACiAJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpKSB7CiAJCQl0dzMyKEhPU1RDQ19TVEFUX0NPQUxfVElDS1MsCi0JCQkgICAgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTKTsKKwkJCSAgICAgdHAtPmNvYWwuc3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MpOwogCQl9IGVsc2UgewogCQkJdHczMihIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTLCAwKTsKIAkJfQpAQCAtMjg4Niw3ICsyODk1LDYgQEAKIAkgKiBBbGwgUlggImxvY2tpbmciIGlzIGRvbmUgYnkgZW5zdXJpbmcgb3V0c2lkZQogCSAqIGNvZGUgc3luY2hyb25pemVzIHdpdGggZGV2LT5wb2xsKCkKIAkgKi8KLQlkb25lID0gMTsKIAlpZiAoc2Jsay0+aWR4WzBdLnJ4X3Byb2R1Y2VyICE9IHRwLT5yeF9yY2JfcHRyKSB7CiAJCWludCBvcmlnX2J1ZGdldCA9ICpidWRnZXQ7CiAJCWludCB3b3JrX2RvbmU7CkBAIC0yODk4LDEyICsyOTA2LDE0IEBACiAKIAkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CiAJCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOwotCi0JCWlmICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCi0JCQlkb25lID0gMDsKIAl9CiAKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RBR0dFRF9TVEFUVVMpCisJCXRwLT5sYXN0X3RhZyA9IHNibGstPnN0YXR1c190YWc7CisJcm1iKCk7CisKIAkvKiBpZiBubyBtb3JlIHdvcmssIHRlbGwgbmV0IHN0YWNrIGFuZCBOSUMgd2UncmUgZG9uZSAqLworCWRvbmUgPSAhdGczX2hhc193b3JrKHRwKTsKIAlpZiAoZG9uZSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKIAkJX19uZXRpZl9yeF9jb21wbGV0ZShuZXRkZXYpOwpAQCAtMjkyOCwyMiArMjkzOCwyMSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOwogCiAJLyoKLQkgKiB3cml0aW5nIGFueSB2YWx1ZSB0byBpbnRyLW1ib3gtMCBjbGVhcnMgUENJIElOVEEjIGFuZAorCSAqIFdyaXRpbmcgYW55IHZhbHVlIHRvIGludHItbWJveC0wIGNsZWFycyBQQ0kgSU5UQSMgYW5kCiAJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCi0JICogd3JpdGluZyBub24temVybyB0byBpbnRyLW1ib3gtMCBhZGRpdGlvbmFsIHRlbGxzIHRoZQorCSAqIFdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKIAkgKiBOSUMgdG8gc3RvcCBzZW5kaW5nIHVzIGlycXMsIGVuZ2FnaW5nICJpbi1pbnRyLWhhbmRsZXIiCiAJICogZXZlbnQgY29hbGVzY2luZy4KIAkgKi8KIAl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAxKTsKKwl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOwogCXNibGstPnN0YXR1cyAmPSB+U0RfU1RBVFVTX1VQREFURUQ7Ci0KIAlpZiAobGlrZWx5KHRnM19oYXNfd29yayh0cCkpKQogCQluZXRpZl9yeF9zY2hlZHVsZShkZXYpOwkJLyogc2NoZWR1bGUgTkFQSSBwb2xsICovCiAJZWxzZSB7Ci0JCS8qIG5vIHdvcmssIHJlLWVuYWJsZSBpbnRlcnJ1cHRzCi0JCSAqLworCQkvKiBObyB3b3JrLCByZS1lbmFibGUgaW50ZXJydXB0cy4gICovCiAJCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csCi0JCQkgICAgIDB4MDAwMDAwMDApOworCQkJICAgICB0cC0+bGFzdF90YWcgPDwgMjQpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CkBAIC0yOTY5LDYgKzI5NzgsNTIgQEAKIAlpZiAoKHNibGstPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKSB8fAogCSAgICAhKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0lOVF9OT1RfQUNUSVZFKSkgewogCQkvKgorCQkgKiBXcml0aW5nIGFueSB2YWx1ZSB0byBpbnRyLW1ib3gtMCBjbGVhcnMgUENJIElOVEEjIGFuZAorCQkgKiBjaGlwLWludGVybmFsIGludGVycnVwdCBwZW5kaW5nIGV2ZW50cy4KKwkJICogV3JpdGluZyBub24temVybyB0byBpbnRyLW1ib3gtMCBhZGRpdGlvbmFsIHRlbGxzIHRoZQorCQkgKiBOSUMgdG8gc3RvcCBzZW5kaW5nIHVzIGlycXMsIGVuZ2FnaW5nICJpbi1pbnRyLWhhbmRsZXIiCisJCSAqIGV2ZW50IGNvYWxlc2NpbmcuCisJCSAqLworCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAweDAwMDAwMDAxKTsKKwkJc2Jsay0+c3RhdHVzICY9IH5TRF9TVEFUVVNfVVBEQVRFRDsKKwkJaWYgKGxpa2VseSh0ZzNfaGFzX3dvcmsodHApKSkKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KKwkJZWxzZSB7CisJCQkvKiBObyB3b3JrLCBzaGFyZWQgaW50ZXJydXB0IHBlcmhhcHM/ICByZS1lbmFibGUKKwkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQorCQkJICovCisJCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAJMHgwMDAwMDAwMCk7CisJCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCX0KKwl9IGVsc2UgewkvKiBzaGFyZWQgaW50ZXJydXB0ICovCisJCWhhbmRsZWQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRnM19pbnRlcnJ1cHRfdGFnZ2VkKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJbiBJTlR4IG1vZGUsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaW50ZXJydXB0IHRvIGFycml2ZSBhdAorCSAqIHRoZSBDUFUgYmVmb3JlIHRoZSBzdGF0dXMgYmxvY2sgcG9zdGVkIHByaW9yIHRvIHRoZSBpbnRlcnJ1cHQuCisJICogUmVhZGluZyB0aGUgUENJIFN0YXRlIHJlZ2lzdGVyIHdpbGwgY29uZmlybSB3aGV0aGVyIHRoZQorCSAqIGludGVycnVwdCBpcyBvdXJzIGFuZCB3aWxsIGZsdXNoIHRoZSBzdGF0dXMgYmxvY2suCisJICovCisJaWYgKChzYmxrLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkgfHwKKwkgICAgISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRSkpIHsKKwkJLyoKIAkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKIAkJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCiAJCSAqIHdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKQEAgLTI5NzcsMTMgKzMwMzIsOCBAQAogCQkgKi8KIAkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywKIAkJCSAgICAgMHgwMDAwMDAwMSk7Ci0JCS8qCi0JCSAqIEZsdXNoIFBDSSB3cml0ZS4gIFRoaXMgYWxzbyBndWFyYW50ZWVzIHRoYXQgb3VyCi0JCSAqIHN0YXR1cyBibG9jayBoYXMgYmVlbiBmbHVzaGVkIHRvIGhvc3QgbWVtb3J5LgotCQkgKi8KLQkJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworCQl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOwogCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwotCiAJCWlmIChsaWtlbHkodGczX2hhc193b3JrKHRwKSkpCiAJCQluZXRpZl9yeF9zY2hlZHVsZShkZXYpOwkJLyogc2NoZWR1bGUgTkFQSSBwb2xsICovCiAJCWVsc2UgewpAQCAtMjk5MSw3ICszMDQxLDcgQEAKIAkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQogCQkJICovCiAJCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAotCQkJICAgICAJMHgwMDAwMDAwMCk7CisJCQkJICAgICB0cC0+bGFzdF90YWcgPDwgMjQpOwogCQkJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOwogCQl9CiAJfSBlbHNlIHsJLyogc2hhcmVkIGludGVycnVwdCAqLwpAQCAtNTA0NCw2ICs1MDk0LDI3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9fdGczX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgdGczX3NldF9jb2FsZXNjZShzdHJ1Y3QgdGczICp0cCwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQoreworCXR3MzIoSE9TVENDX1JYQ09MX1RJQ0tTLCBlYy0+cnhfY29hbGVzY2VfdXNlY3MpOworCXR3MzIoSE9TVENDX1RYQ09MX1RJQ0tTLCBlYy0+dHhfY29hbGVzY2VfdXNlY3MpOworCXR3MzIoSE9TVENDX1JYTUFYX0ZSQU1FUywgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwl0dzMyKEhPU1RDQ19UWE1BWF9GUkFNRVMsIGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCXR3MzIoSE9TVENDX1JYQ09BTF9USUNLX0lOVCwgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSk7CisJCXR3MzIoSE9TVENDX1RYQ09BTF9USUNLX0lOVCwgZWMtPnR4X2NvYWxlc2NlX3VzZWNzX2lycSk7CisJfQorCXR3MzIoSE9TVENDX1JYQ09BTF9NQVhGX0lOVCwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSk7CisJdHczMihIT1NUQ0NfVFhDT0FMX01BWEZfSU5ULCBlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxKTsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJdTMyIHZhbCA9IGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjczsKKworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikpCisJCQl2YWwgPSAwOworCisJCXR3MzIoSE9TVENDX1NUQVRfQ09BTF9USUNLUywgdmFsKTsKKwl9Cit9CiAKIC8qIHRwLT5sb2NrIGlzIGhlbGQuICovCiBzdGF0aWMgaW50IHRnM19yZXNldF9odyhzdHJ1Y3QgdGczICp0cCkKQEAgLTUzNjYsMTYgKzU0MzcsNyBAQAogCQl1ZGVsYXkoMTApOwogCX0KIAotCXR3MzIoSE9TVENDX1JYQ09MX1RJQ0tTLCAwKTsKLQl0dzMyKEhPU1RDQ19UWENPTF9USUNLUywgTE9XX1RYQ09MX1RJQ0tTKTsKLQl0dzMyKEhPU1RDQ19SWE1BWF9GUkFNRVMsIDEpOwotCXR3MzIoSE9TVENDX1RYTUFYX0ZSQU1FUywgTE9XX1JYTUFYX0ZSQU1FUyk7Ci0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7Ci0JCXR3MzIoSE9TVENDX1JYQ09BTF9USUNLX0lOVCwgMCk7Ci0JCXR3MzIoSE9TVENDX1RYQ09BTF9USUNLX0lOVCwgMCk7Ci0JfQotCXR3MzIoSE9TVENDX1JYQ09BTF9NQVhGX0lOVCwgMSk7Ci0JdHczMihIT1NUQ0NfVFhDT0FMX01BWEZfSU5ULCAwKTsKKwl0ZzNfc2V0X2NvYWxlc2NlKHRwLCAmdHAtPmNvYWwpOwogCiAJLyogc2V0IHN0YXR1cyBibG9jayBETUEgYWRkcmVzcyAqLwogCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILApAQCAtNTM4OCw4ICs1NDUwLDYgQEAKIAkJICogdGhlIHRnM19wZXJpb2RpY19mZXRjaF9zdGF0cyBjYWxsIHRoZXJlLCBhbmQKIAkJICogdGczX2dldF9zdGF0cyB0byBzZWUgaG93IHRoaXMgd29ya3MgZm9yIDU3MDUvNTc1MCBjaGlwcy4KIAkJICovCi0JCXR3MzIoSE9TVENDX1NUQVRfQ09BTF9USUNLUywKLQkJICAgICBERUZBVUxUX1NUQVRfQ09BTF9USUNLUyk7CiAJCXR3MzIoSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsCiAJCSAgICAgKCh1NjQpIHRwLT5zdGF0c19tYXBwaW5nID4+IDMyKSk7CiAJCXR3MzIoSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKQEAgLTU0NDUsNyArNTUwNSw4IEBACiAJdWRlbGF5KDEwMCk7CiAKIAl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKLQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzApOworCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XKTsKKwl0cC0+bGFzdF90YWcgPSAwOwogCiAJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CiAJCXR3MzJfZihETUFDX01PREUsIERNQUNfTU9ERV9FTkFCTEUpOwpAQCAtNTcyMywzMSArNTc4NCwzMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOwogCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOwogCi0JLyogQWxsIG9mIHRoaXMgZ2FyYmFnZSBpcyBiZWNhdXNlIHdoZW4gdXNpbmcgbm9uLXRhZ2dlZAotCSAqIElSUSBzdGF0dXMgdGhlIG1haWxib3gvc3RhdHVzX2Jsb2NrIHByb3RvY29sIHRoZSBjaGlwCi0JICogdXNlcyB3aXRoIHRoZSBjcHUgaXMgcmFjZSBwcm9uZS4KLQkgKi8KLQlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHsKLQkJdHczMihHUkNfTE9DQUxfQ1RSTCwKLQkJICAgICB0cC0+Z3JjX2xvY2FsX2N0cmwgfCBHUkNfTENMQ1RSTF9TRVRJTlQpOwotCX0gZWxzZSB7Ci0JCXR3MzIoSE9TVENDX01PREUsIHRwLT5jb2FsZXNjZV9tb2RlIHwKLQkJICAgICAoSE9TVENDX01PREVfRU5BQkxFIHwgSE9TVENDX01PREVfTk9XKSk7Ci0JfQorCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UQUdHRURfU1RBVFVTKSkgeworCQkvKiBBbGwgb2YgdGhpcyBnYXJiYWdlIGlzIGJlY2F1c2Ugd2hlbiB1c2luZyBub24tdGFnZ2VkCisJCSAqIElSUSBzdGF0dXMgdGhlIG1haWxib3gvc3RhdHVzX2Jsb2NrIHByb3RvY29sIHRoZSBjaGlwCisJCSAqIHVzZXMgd2l0aCB0aGUgY3B1IGlzIHJhY2UgcHJvbmUuCisJCSAqLworCQlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHsKKwkJCXR3MzIoR1JDX0xPQ0FMX0NUUkwsCisJCQkgICAgIHRwLT5ncmNfbG9jYWxfY3RybCB8IEdSQ19MQ0xDVFJMX1NFVElOVCk7CisJCX0gZWxzZSB7CisJCQl0dzMyKEhPU1RDQ19NT0RFLCB0cC0+Y29hbGVzY2VfbW9kZSB8CisJCQkgICAgIChIT1NUQ0NfTU9ERV9FTkFCTEUgfCBIT1NUQ0NfTU9ERV9OT1cpKTsKKwkJfQogCi0JaWYgKCEodHIzMihXRE1BQ19NT0RFKSAmIFdETUFDX01PREVfRU5BQkxFKSkgewotCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSOwotCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOwotCQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7Ci0JCXJldHVybjsKKwkJaWYgKCEodHIzMihXRE1BQ19NT0RFKSAmIFdETUFDX01PREVfRU5BQkxFKSkgeworCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUkVTVEFSVF9USU1FUjsKKwkJCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworCQkJcmV0dXJuOworCQl9CiAJfQogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQotCQl0ZzNfcGVyaW9kaWNfZmV0Y2hfc3RhdHModHApOwotCiAJLyogVGhpcyBwYXJ0IG9ubHkgcnVucyBvbmNlIHBlciBzZWNvbmQuICovCiAJaWYgKCEtLXRwLT50aW1lcl9jb3VudGVyKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykKKwkJCXRnM19wZXJpb2RpY19mZXRjaF9zdGF0cyh0cCk7CisKIAkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTElOS0NIR19SRUcpIHsKIAkJCXUzMiBtYWNfc3RhdDsKIAkJCWludCBwaHlfZXZlbnQ7CkBAIC01ODQ2LDkgKzU5MDksMTMgQEAKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9VU0lOR19NU0kpCiAJCWVyciA9IHJlcXVlc3RfaXJxKHRwLT5wZGV2LT5pcnEsIHRnM19tc2ksCiAJCQkJICBTQV9TQU1QTEVfUkFORE9NLCBkZXYtPm5hbWUsIGRldik7Ci0JZWxzZQotCQllcnIgPSByZXF1ZXN0X2lycSh0cC0+cGRldi0+aXJxLCB0ZzNfaW50ZXJydXB0LAorCWVsc2UgeworCQlpcnFyZXR1cm5fdCAoKmZuKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik9dGczX2ludGVycnVwdDsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UQUdHRURfU1RBVFVTKQorCQkJZm4gPSB0ZzNfaW50ZXJydXB0X3RhZ2dlZDsKKwkJZXJyID0gcmVxdWVzdF9pcnEodHAtPnBkZXYtPmlycSwgZm4sCiAJCQkJICBTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIGRldi0+bmFtZSwgZGV2KTsKKwl9CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNTkwMCw5ICs1OTY3LDE0IEBACiAKIAl0cC0+dGczX2ZsYWdzMiAmPSB+VEczX0ZMRzJfVVNJTkdfTVNJOwogCi0JZXJyID0gcmVxdWVzdF9pcnEodHAtPnBkZXYtPmlycSwgdGczX2ludGVycnVwdCwKLQkJCSAgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBkZXYtPm5hbWUsIGRldik7CisJeworCQlpcnFyZXR1cm5fdCAoKmZuKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik9dGczX2ludGVycnVwdDsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UQUdHRURfU1RBVFVTKQorCQkJZm4gPSB0ZzNfaW50ZXJydXB0X3RhZ2dlZDsKIAorCQllcnIgPSByZXF1ZXN0X2lycSh0cC0+cGRldi0+aXJxLCBmbiwKKwkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwgZGV2LT5uYW1lLCBkZXYpOworCX0KIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC01OTQ4LDcgKzYwMjAsMTMgQEAKIAlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTc1MF9QTFVTKSAmJgogCSAgICAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IENISVBSRVZfNTc1MF9BWCkgJiYKIAkgICAgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBDSElQUkVWXzU3NTBfQlgpKSB7Ci0JCWlmIChwY2lfZW5hYmxlX21zaSh0cC0+cGRldikgPT0gMCkgeworCQkvKiBBbGwgTVNJIHN1cHBvcnRpbmcgY2hpcHMgc2hvdWxkIHN1cHBvcnQgdGFnZ2VkCisJCSAqIHN0YXR1cy4gIEFzc2VydCB0aGF0IHRoaXMgaXMgdGhlIGNhc2UuCisJCSAqLworCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogTVNJIHdpdGhvdXQgVEFHR0VEPyAiCisJCQkgICAgICAgIk5vdCB1c2luZyBNU0kuXG4iLCB0cC0+ZGV2LT5uYW1lKTsKKwkJfSBlbHNlIGlmIChwY2lfZW5hYmxlX21zaSh0cC0+cGRldikgPT0gMCkgewogCQkJdTMyIG1zaV9tb2RlOwogCiAJCQltc2lfbW9kZSA9IHRyMzIoTVNHSU5UX01PREUpOwpAQCAtNTk1OSw5ICs2MDM3LDE0IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVVNJTkdfTVNJKQogCQllcnIgPSByZXF1ZXN0X2lycSh0cC0+cGRldi0+aXJxLCB0ZzNfbXNpLAogCQkJCSAgU0FfU0FNUExFX1JBTkRPTSwgZGV2LT5uYW1lLCBkZXYpOwotCWVsc2UKLQkJZXJyID0gcmVxdWVzdF9pcnEodHAtPnBkZXYtPmlycSwgdGczX2ludGVycnVwdCwKKwllbHNlIHsKKwkJaXJxcmV0dXJuX3QgKCpmbikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopPXRnM19pbnRlcnJ1cHQ7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykKKwkJCWZuID0gdGczX2ludGVycnVwdF90YWdnZWQ7CisKKwkJZXJyID0gcmVxdWVzdF9pcnEodHAtPnBkZXYtPmlycSwgZm4sCiAJCQkJICBTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIGRldi0+bmFtZSwgZGV2KTsKKwl9CiAKIAlpZiAoZXJyKSB7CiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1VTSU5HX01TSSkgewpAQCAtNTk4MCw5ICs2MDYzLDE2IEBACiAJCXRnM19oYWx0KHRwLCAxKTsKIAkJdGczX2ZyZWVfcmluZ3ModHApOwogCX0gZWxzZSB7Ci0JCXRwLT50aW1lcl9vZmZzZXQgPSBIWiAvIDEwOwotCQl0cC0+dGltZXJfY291bnRlciA9IHRwLT50aW1lcl9tdWx0aXBsaWVyID0gMTA7Ci0JCXRwLT5hc2ZfY291bnRlciA9IHRwLT5hc2ZfbXVsdGlwbGllciA9ICgxMCAqIDEyMCk7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykKKwkJCXRwLT50aW1lcl9vZmZzZXQgPSBIWjsKKwkJZWxzZQorCQkJdHAtPnRpbWVyX29mZnNldCA9IEhaIC8gMTA7CisKKwkJQlVHX09OKHRwLT50aW1lcl9vZmZzZXQgPiBIWik7CisJCXRwLT50aW1lcl9jb3VudGVyID0gdHAtPnRpbWVyX211bHRpcGxpZXIgPQorCQkJKEhaIC8gdHAtPnRpbWVyX29mZnNldCk7CisJCXRwLT5hc2ZfY291bnRlciA9IHRwLT5hc2ZfbXVsdGlwbGllciA9CisJCQkoKEhaIC8gdHAtPnRpbWVyX29mZnNldCkgKiAxMjApOwogCiAJCWluaXRfdGltZXIoJnRwLT50aW1lcik7CiAJCXRwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHRwLT50aW1lcl9vZmZzZXQ7CkBAIC02MDA1LDYgKzYwOTUsNyBAQAogCiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVVNJTkdfTVNJKSB7CiAJCWVyciA9IHRnM190ZXN0X21zaSh0cCk7CisKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwogCQkJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CkBAIC03MjAzLDYgKzcyOTQsMTQgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IHRnM19nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbWNweShlYywgJnRwLT5jb2FsLCBzaXplb2YoKmVjKSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdGczX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gdGczX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IHRnM19zZXRfc2V0dGluZ3MsCkBAIC03MjM1LDYgKzczMzQsNyBAQAogCS5nZXRfc3RyaW5ncwkJPSB0ZzNfZ2V0X3N0cmluZ3MsCiAJLmdldF9zdGF0c19jb3VudAk9IHRnM19nZXRfc3RhdHNfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gdGczX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfY29hbGVzY2UJCT0gdGczX2dldF9jb2FsZXNjZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfZ2V0X2VlcHJvbV9zaXplKHN0cnVjdCB0ZzMgKnRwKQpAQCAtODQyMiwxNSArODUyMiw3IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfQkVSX0JVRzsKIAotCS8qIE9ubHkgNTcwMSBhbmQgbGF0ZXIgc3VwcG9ydCB0YWdnZWQgaXJxIHN0YXR1cyBtb2RlLgotCSAqIEFsc28sIDU3ODggY2hpcHMgY2Fubm90IHVzZSB0YWdnZWQgaXJxIHN0YXR1cy4KLQkgKgotCSAqIEhvd2V2ZXIsIHNpbmNlIHdlIGFyZSB1c2luZyBOQVBJIGF2b2lkIHRhZ2dlZCBpcnEgc3RhdHVzCi0JICogYmVjYXVzZSB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbiBpcyBtb3JlIGRpZmZpY3VsdCB0bwotCSAqIGZ1bGx5IGNsZWFyIGluIHRoYXQgbW9kZS4KLQkgKi8KIAl0cC0+Y29hbGVzY2VfbW9kZSA9IDA7Ci0KIAlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IENISVBSRVZfNTcwMF9BWCAmJgogCSAgICBHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQ0hJUFJFVl81NzAwX0JYKQogCQl0cC0+Y29hbGVzY2VfbW9kZSB8PSBIT1NUQ0NfTU9ERV8zMkJZVEU7CkBAIC04NDk0LDYgKzg1ODYsMTggQEAKIAkgICAgIGdyY19taXNjX2NmZyA9PSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OE0pKQogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9JU181Nzg4OwogCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU181Nzg4KSAmJgorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDApKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1RBR0dFRF9TVEFUVVM7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UQUdHRURfU1RBVFVTKSB7CisJCXRwLT5jb2FsZXNjZV9tb2RlIHw9IChIT1NUQ0NfTU9ERV9DTFJUSUNLX1JYQkQgfAorCQkJCSAgICAgIEhPU1RDQ19NT0RFX0NMUlRJQ0tfVFhCRCk7CisKKwkJdHAtPm1pc2NfaG9zdF9jdHJsIHw9IE1JU0NfSE9TVF9DVFJMX1RBR0dFRF9TVEFUVVM7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKwl9CisKIAkvKiB0aGVzZSBhcmUgbGltaXRlZCB0byAxMC8xMDAgb25seSAqLwogCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgJiYKIAkgICAgIChncmNfbWlzY19jZmcgPT0gMHg4MDAwIHx8IGdyY19taXNjX2NmZyA9PSAweDQwMDApKSB8fApAQCAtODY3MSw2ICs4Nzc1LDE0NiBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIEJPVU5EQVJZX1NJTkdMRV9DQUNIRUxJTkUJMQorI2RlZmluZSBCT1VOREFSWV9NVUxUSV9DQUNIRUxJTkUJMgorCitzdGF0aWMgdTMyIF9fZGV2aW5pdCB0ZzNfY2FsY19kbWFfYm5kcnkoc3RydWN0IHRnMyAqdHAsIHUzMiB2YWwpCit7CisJaW50IGNhY2hlbGluZV9zaXplOworCXU4IGJ5dGU7CisJaW50IGdvYWw7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSh0cC0+cGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCWlmIChieXRlID09IDApCisJCWNhY2hlbGluZV9zaXplID0gMTAyNDsKKwllbHNlCisJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkvKiBPbiA1NzAzIGFuZCBsYXRlciBjaGlwcywgdGhlIGJvdW5kYXJ5IGJpdHMgaGF2ZSBubworCSAqIGVmZmVjdC4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkKKwkJZ290byBvdXQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfUEFSSVNDKQorCWdvYWwgPSBCT1VOREFSWV9NVUxUSV9DQUNIRUxJTkU7CisjZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX1NQQVJDNjQpIHx8IGRlZmluZWQoQ09ORklHX0FMUEhBKQorCWdvYWwgPSBCT1VOREFSWV9TSU5HTEVfQ0FDSEVMSU5FOworI2Vsc2UKKwlnb2FsID0gMDsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoIWdvYWwpCisJCWdvdG8gb3V0OworCisJLyogUENJIGNvbnRyb2xsZXJzIG9uIG1vc3QgUklTQyBzeXN0ZW1zIHRlbmQgdG8gZGlzY29ubmVjdAorCSAqIHdoZW4gYSBkZXZpY2UgdHJpZXMgdG8gYnVyc3QgYWNyb3NzIGEgY2FjaGUtbGluZSBib3VuZGFyeS4KKwkgKiBUaGVyZWZvcmUsIGxldHRpbmcgdGczIGRvIHNvIGp1c3Qgd2FzdGVzIFBDSSBiYW5kd2lkdGguCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5LCBmb3IgUENJLUUgdGhlcmUgYXJlIG9ubHkgbGltaXRlZAorCSAqIHdyaXRlLXNpZGUgY29udHJvbHMgZm9yIHRoaXMsIGFuZCB0aHVzIGZvciByZWFkcworCSAqIHdlIHdpbGwgc3RpbGwgZ2V0IHRoZSBkaXNjb25uZWN0cy4gIFdlJ2xsIGFsc28gd2FzdGUKKwkgKiB0aGVzZSBQQ0kgY3ljbGVzIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlIGZvciBjaGlwcworCSAqIG90aGVyIHRoYW4gNTcwMCBhbmQgNTcwMSB3aGljaCBkbyBub3QgaW1wbGVtZW50IHRoZQorCSAqIGJvdW5kYXJ5IGJpdHMuCisJICovCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAmJgorCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKSB7CisJCXN3aXRjaCAoY2FjaGVsaW5lX3NpemUpIHsKKwkJY2FzZSAxNjoKKwkJY2FzZSAzMjoKKwkJY2FzZSA2NDoKKwkJY2FzZSAxMjg6CisJCQlpZiAoZ29hbCA9PSBCT1VOREFSWV9TSU5HTEVfQ0FDSEVMSU5FKSB7CisJCQkJdmFsIHw9IChETUFfUldDVFJMX1JFQURfQk5EUllfMTI4X1BDSVggfAorCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzEyOF9QQ0lYKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsIHw9IChETUFfUldDVFJMX1JFQURfQk5EUllfMzg0X1BDSVggfAorCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzM4NF9QQ0lYKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjU2OgorCQkJdmFsIHw9IChETUFfUldDVFJMX1JFQURfQk5EUllfMjU2X1BDSVggfAorCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2X1BDSVgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXZhbCB8PSAoRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzM4NF9QQ0lYIHwKKwkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzM4NF9QQ0lYKTsKKwkJCWJyZWFrOworCQl9OworCX0gZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQlzd2l0Y2ggKGNhY2hlbGluZV9zaXplKSB7CisJCWNhc2UgMTY6CisJCWNhc2UgMzI6CisJCWNhc2UgNjQ6CisJCQlpZiAoZ29hbCA9PSBCT1VOREFSWV9TSU5HTEVfQ0FDSEVMSU5FKSB7CisJCQkJdmFsICY9IH5ETUFfUldDVFJMX1dSSVRFX0JORFJZX0RJU0FCX1BDSUU7CisJCQkJdmFsIHw9IERNQV9SV0NUUkxfV1JJVEVfQk5EUllfNjRfUENJRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgMTI4OgorCQlkZWZhdWx0OgorCQkJdmFsICY9IH5ETUFfUldDVFJMX1dSSVRFX0JORFJZX0RJU0FCX1BDSUU7CisJCQl2YWwgfD0gRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjhfUENJRTsKKwkJCWJyZWFrOworCQl9OworCX0gZWxzZSB7CisJCXN3aXRjaCAoY2FjaGVsaW5lX3NpemUpIHsKKwkJY2FzZSAxNjoKKwkJCWlmIChnb2FsID09IEJPVU5EQVJZX1NJTkdMRV9DQUNIRUxJTkUpIHsKKwkJCQl2YWwgfD0gKERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xNiB8CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTYpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAzMjoKKwkJCWlmIChnb2FsID09IEJPVU5EQVJZX1NJTkdMRV9DQUNIRUxJTkUpIHsKKwkJCQl2YWwgfD0gKERNQV9SV0NUUkxfUkVBRF9CTkRSWV8zMiB8CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSA2NDoKKwkJCWlmIChnb2FsID09IEJPVU5EQVJZX1NJTkdMRV9DQUNIRUxJTkUpIHsKKwkJCQl2YWwgfD0gKERNQV9SV0NUUkxfUkVBRF9CTkRSWV82NCB8CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfNjQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAxMjg6CisJCQlpZiAoZ29hbCA9PSBCT1VOREFSWV9TSU5HTEVfQ0FDSEVMSU5FKSB7CisJCQkJdmFsIHw9IChETUFfUldDVFJMX1JFQURfQk5EUllfMTI4IHwKKwkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjgpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAyNTY6CisJCQl2YWwgfD0gKERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTYgfAorCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2KTsKKwkJCWJyZWFrOworCQljYXNlIDUxMjoKKwkJCXZhbCB8PSAoRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzUxMiB8CisJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV81MTIpOworCQkJYnJlYWs7CisJCWNhc2UgMTAyNDoKKwkJZGVmYXVsdDoKKwkJCXZhbCB8PSAoRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEwMjQgfAorCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTAyNCk7CisJCQlicmVhazsKKwkJfTsKKwl9CisKK291dDoKKwlyZXR1cm4gdmFsOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfZG9fdGVzdF9kbWEoc3RydWN0IHRnMyAqdHAsIHUzMiAqYnVmLCBkbWFfYWRkcl90IGJ1Zl9kbWEsIGludCBzaXplLCBpbnQgdG9fZGV2aWNlKQogewogCXN0cnVjdCB0ZzNfaW50ZXJuYWxfYnVmZmVyX2Rlc2MgdGVzdF9kZXNjOwpAQCAtODc1MiwxMiArODk5NiwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgVEVTVF9CVUZGRVJfU0laRQkweDQwMAorI2RlZmluZSBURVNUX0JVRkZFUl9TSVpFCTB4MjAwMAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfdGVzdF9kbWEoc3RydWN0IHRnMyAqdHApCiB7CiAJZG1hX2FkZHJfdCBidWZfZG1hOwotCXUzMiAqYnVmOworCXUzMiAqYnVmLCBzYXZlZF9kbWFfcndjdHJsOwogCWludCByZXQ7CiAKIAlidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEVTVF9CVUZGRVJfU0laRSwgJmJ1Zl9kbWEpOwpAQCAtODc2OSw0NiArOTAxMyw3IEBACiAJdHAtPmRtYV9yd2N0cmwgPSAoKDB4NyA8PCBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQpIHwKIAkJCSAgKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkpOwogCi0jaWZuZGVmIENPTkZJR19YODYKLQl7Ci0JCXU4IGJ5dGU7Ci0JCWludCBjYWNoZWxpbmVfc2l6ZTsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKLQotCQlpZiAoYnl0ZSA9PSAwKQotCQkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OwotCQllbHNlCi0JCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OwotCi0JCXN3aXRjaCAoY2FjaGVsaW5lX3NpemUpIHsKLQkJY2FzZSAxNjoKLQkJY2FzZSAzMjoKLQkJY2FzZSA2NDoKLQkJY2FzZSAxMjg6Ci0JCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpICYmCi0JCQkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkgewotCQkJCXRwLT5kbWFfcndjdHJsIHw9Ci0JCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzg0X1BDSVg7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKLQkJCQl0cC0+ZG1hX3J3Y3RybCAmPQotCQkJCQl+KERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRCk7Ci0JCQkJdHAtPmRtYV9yd2N0cmwgfD0KLQkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjhfUENJRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGZhbGx0aHJvdWdoICovCi0JCWNhc2UgMjU2OgotCQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgJiYKLQkJCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKQotCQkJCXRwLT5kbWFfcndjdHJsIHw9Ci0JCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2OwotCQkJZWxzZSBpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkKLQkJCQl0cC0+ZG1hX3J3Y3RybCB8PQotCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1Nl9QQ0lYOwotCQl9OwotCX0KLSNlbmRpZgorCXRwLT5kbWFfcndjdHJsID0gdGczX2NhbGNfZG1hX2JuZHJ5KHRwLCB0cC0+ZG1hX3J3Y3RybCk7CiAKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgewogCQkvKiBETUEgcmVhZCB3YXRlcm1hcmsgbm90IHVzZWQgb24gUENJRSAqLwpAQCAtODgyNyw3ICs5MDMyLDcgQEAKIAkJCWlmIChjY3ZhbCA9PSAweDYgfHwgY2N2YWwgPT0gMHg3KQogCQkJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfT05FX0RNQTsKIAotCQkJLyogU2V0IGJpdCAyMyB0byByZW5hYmxlIFBDSVggaHcgYnVnIGZpeCAqLworCQkJLyogU2V0IGJpdCAyMyB0byBlbmFibGUgUENJWCBodyBidWcgZml4ICovCiAJCQl0cC0+ZG1hX3J3Y3RybCB8PSAweDAwOWYwMDAwOwogCQl9IGVsc2UgewogCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDFiMDAwZjsKQEAgLTg4NjgsNiArOTA3MywxMyBAQAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkKIAkJZ290byBvdXQ7CiAKKwkvKiBJdCBpcyBiZXN0IHRvIHBlcmZvcm0gRE1BIHRlc3Qgd2l0aCBtYXhpbXVtIHdyaXRlIGJ1cnN0IHNpemUKKwkgKiB0byBleHBvc2UgdGhlIDU3MDAvNTcwMSB3cml0ZSBETUEgYnVnLgorCSAqLworCXNhdmVkX2RtYV9yd2N0cmwgPSB0cC0+ZG1hX3J3Y3RybDsKKwl0cC0+ZG1hX3J3Y3RybCAmPSB+RE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLOworCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisKIAl3aGlsZSAoMSkgewogCQl1MzIgKnAgPSBidWYsIGk7CiAKQEAgLTg5MDYsOCArOTExOCw5IEBACiAJCQlpZiAocFtpXSA9PSBpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoKHRwLT5kbWFfcndjdHJsICYgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLKSA9PQotCQkJICAgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIpIHsKKwkJCWlmICgodHAtPmRtYV9yd2N0cmwgJiBETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0spICE9CisJCQkgICAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xNikgeworCQkJCXRwLT5kbWFfcndjdHJsICY9IH5ETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0s7CiAJCQkJdHAtPmRtYV9yd2N0cmwgfD0gRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xNjsKIAkJCQl0dzMyKFRHM1BDSV9ETUFfUldfQ1RSTCwgdHAtPmRtYV9yd2N0cmwpOwogCQkJCWJyZWFrOwpAQCAtODkyNCw2ICs5MTM3LDE0IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlpZiAoKHRwLT5kbWFfcndjdHJsICYgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLKSAhPQorCSAgICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzE2KSB7CisJCS8qIERNQSB0ZXN0IHBhc3NlZCB3aXRob3V0IGFkanVzdGluZyBETUEgYm91bmRhcnksCisJCSAqIGp1c3QgcmVzdG9yZSB0aGUgY2FsY3VsYXRlZCBETUEgYm91bmRhcnkKKwkJICovCisJCXRwLT5kbWFfcndjdHJsID0gc2F2ZWRfZG1hX3J3Y3RybDsKKwkJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKwl9CiAKIG91dDoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBURVNUX0JVRkZFUl9TSVpFLCBidWYsIGJ1Zl9kbWEpOwpAQCAtOTAxMSw2ICs5MjMyLDMxIEBACiAJcmV0dXJuIHBlZXI7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9jb2FsKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYyA9ICZ0cC0+Y29hbDsKKworCW1lbXNldChlYywgMCwgc2l6ZW9mKCplYykpOworCWVjLT5jbWQgPSBFVEhUT09MX0dDT0FMRVNDRTsKKwllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSBMT1dfUlhDT0xfVElDS1M7CisJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gTE9XX1RYQ09MX1RJQ0tTOworCWVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IExPV19SWE1BWF9GUkFNRVM7CisJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gTE9XX1RYTUFYX0ZSQU1FUzsKKwllYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxID0gREVGQVVMVF9SWENPQUxfVElDS19JTlQ7CisJZWMtPnR4X2NvYWxlc2NlX3VzZWNzX2lycSA9IERFRkFVTFRfVFhDT0FMX1RJQ0tfSU5UOworCWVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVDsKKwllYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxID0gREVGQVVMVF9UWENPQUxfTUFYRl9JTlQ7CisJZWMtPnN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzID0gREVGQVVMVF9TVEFUX0NPQUxfVElDS1M7CisKKwlpZiAodHAtPmNvYWxlc2NlX21vZGUgJiAoSE9TVENDX01PREVfQ0xSVElDS19SWEJEIHwKKwkJCQkgSE9TVENDX01PREVfQ0xSVElDS19UWEJEKSkgeworCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSBMT1dfUlhDT0xfVElDS1NfQ0xSVENLUzsKKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IERFRkFVTFRfUlhDT0FMX1RJQ0tfSU5UX0NMUlRDS1M7CisJCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IExPV19UWENPTF9USUNLU19DTFJUQ0tTOworCQllYy0+dHhfY29hbGVzY2VfdXNlY3NfaXJxID0gREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHRnM19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC05MjU2LDYgKzk1MDIsOCBAQAogCS8qIGZsb3cgY29udHJvbCBhdXRvbmVnb3RpYXRpb24gaXMgZGVmYXVsdCBiZWhhdmlvciAqLwogCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUEFVU0VfQVVUT05FRzsKIAorCXRnM19pbml0X2NvYWwodHApOworCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgpAQCAtOTI5OCw2ICs5NTQ2LDggQEAKIAkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKSAhPSAwLAogCSAgICAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRCkgPT0gMCwKIAkgICAgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpICE9IDApOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkbWFfcndjdHJsWyUwOHhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHRwLT5kbWFfcndjdHJsKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuaCBiL2RyaXZlcnMvbmV0L3RnMy5oCmluZGV4IDhkZTZmMjEuLjk5M2Y4NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5oCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5oCkBAIC04NzYsMTAgKzg3NiwxMiBAQAogI2RlZmluZSAgSE9TVENDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CiAjZGVmaW5lIEhPU1RDQ19SWENPTF9USUNLUwkJMHgwMDAwM2MwOAogI2RlZmluZSAgTE9XX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDAzMgorI2RlZmluZSAgTE9XX1JYQ09MX1RJQ0tTX0NMUlRDS1MJIDB4MDAwMDAwMTQKICNkZWZpbmUgIERFRkFVTFRfUlhDT0xfVElDS1MJCSAweDAwMDAwMDQ4CiAjZGVmaW5lICBISUdIX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgogI2RlZmluZSBIT1NUQ0NfVFhDT0xfVElDS1MJCTB4MDAwMDNjMGMKICNkZWZpbmUgIExPV19UWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIExPV19UWENPTF9USUNLU19DTFJUQ0tTCSAweDAwMDAwMDQ4CiAjZGVmaW5lICBERUZBVUxUX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDEyYwogI2RlZmluZSAgSElHSF9UWENPTF9USUNLUwkJIDB4MDAwMDAxNDUKICNkZWZpbmUgSE9TVENDX1JYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxMApAQCAtODkyLDggKzg5NCwxMCBAQAogI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCiAjZGVmaW5lIEhPU1RDQ19SWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMTgKICNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9USUNLX0lOVF9DTFJUQ0tTIDB4MDAwMDAwMTQKICNkZWZpbmUgSE9TVENDX1RYQ09BTF9USUNLX0lOVAkJMHgwMDAwM2MxYwogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlQJIDB4MDAwMDAwMTkKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX1RJQ0tfSU5UX0NMUlRDS1MgMHgwMDAwMDAxNAogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzIwCiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQogI2RlZmluZSBIT1NUQ0NfVFhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzI0CkBAIC0yMDIzLDYgKzIwMjcsNyBAQAogCiAJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CiAJZG1hX2FkZHJfdAkJCXN0YXR1c19tYXBwaW5nOworCXUzMgkJCQlsYXN0X3RhZzsKIAogCXUzMgkJCQltc2dfZW5hYmxlOwogCkBAIC0yMDY4LDYgKzIwNzMsNyBAQAogCiAJdTMyCQkJCXJ4X29mZnNldDsKIAl1MzIJCQkJdGczX2ZsYWdzOworI2RlZmluZSBURzNfRkxBR19UQUdHRURfU1RBVFVTCQkweDAwMDAwMDAxCiAjZGVmaW5lIFRHM19GTEFHX1RYRF9NQk9YX0hXQlVHCQkweDAwMDAwMDAyCiAjZGVmaW5lIFRHM19GTEFHX1JYX0NIRUNLU1VNUwkJMHgwMDAwMDAwNAogI2RlZmluZSBURzNfRkxBR19VU0VfTElOS0NIR19SRUcJMHgwMDAwMDAwOApAQCAtMjIyNSw3ICsyMjMxLDcgQEAKIAogI2RlZmluZSBTU1RfMjVWRjBYMF9QQUdFX1NJWkUJCTQwOTgKIAotCisJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UJCWNvYWw7CiB9OwogCiAjZW5kaWYgLyogIShfVDNfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCmluZGV4IGVkYWUwOWEuLjkxOWM0MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwpAQCAtMTc0LDYgKzE3NCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKIAl9CiAJCQogCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgMzIgbG9naWMgb25lcy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwppbmRleCBkMDk4YjNiLi5lMGFlM2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCQkJaWYgKGVudHJ5ICE9IDApIHsKIAkJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiBEb24ndCBkbwogCQkJCSAgIHRoaXMgb24gdGhlIFVMSTUyNlggYXMgaXQgdHJpZ2dlcnMgYSBkaWZmZXJlbnQgcHJvYmxlbSAqLwotCQkJCWlmICghKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgKHRwLT5yZXZpc2lvbiA9IDB4NDAgfHwgdHAtPnJldmlzaW9uID09IDB4NTApKSkgeworCQkJCWlmICghKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgKHRwLT5yZXZpc2lvbiA9PSAweDQwIHx8IHRwLT5yZXZpc2lvbiA9PSAweDUwKSkpIHsKIAkJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CiAJCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKIAkJCQkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCAwYWFhMTJjLi4xZDMyMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTMyMyw3ICszMjMsNyBAQAogCSAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2FyZHMgdmlzaXQgPGh0dHA6Ly9wcmlzbTU0Lm9yZz4uCiAJICBIZXJlIGlzIHRoZSBsYXRlc3QgY29uZmlybWVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhcmRzOgogCi0JICAzY29tIE9mZmljZUNvbm5lY3QgMTFnIENhcmRidXMgQ2FyZCBha2EgM0NSV0UxNTRHNzIKKwkgIDNjb20gT2ZmaWNlQ29ubmVjdCAxMWcgQ2FyZGJ1cyBDYXJkIGFrYSAzQ1JXRTE1NEc3MiAodmVyc2lvbiAxKQogCSAgQWxsbmV0IEFMTDAyNzEgUENJIENhcmQKIAkgIENvbXBleCBXTDU0RyBDYXJkYnVzIENhcmQKIAkgIENvcmVnYSBDRy1XTENCNTRHVCBDYXJkYnVzIENhcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwppbmRleCA0NjNjNzg5Li5mYjEwYTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC03NTQsNyArNzU0LDcgQEAKICAgdTggemVybzsKICAgdTggc3NpZExlbjsKICAgdTggc3NpZFszMl07Ci0gIHUxNiByc3NpOworICB1MTYgZEJtOwogI2RlZmluZSBDQVBfRVNTICgxPDwwKQogI2RlZmluZSBDQVBfSUJTUyAoMTw8MSkKICNkZWZpbmUgQ0FQX1BSSVZBQ1kgKDE8PDQpCkBAIC0xMTI1LDYgKzExMjUsOSBAQAogc3RhdGljIGludCBlbmNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgZXRoZXJIZWFkICpwUGFja2V0LCBNSUNCdWZmZXIgKmJ1ZmZlciwgaW50IGxlbik7CiBzdGF0aWMgaW50IGRlY2Fwc3VsYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBNSUNCdWZmZXIgKm1pYywgZXRoZXJIZWFkICpwUGFja2V0LCB1MTYgcGF5TGVuKTsKIAorc3RhdGljIHU4IGFpcm9fcnNzaV90b19kYm0gKHRkc1Jzc2lFbnRyeSAqcnNzaV9yaWQsIHU4IHJzc2kpOworc3RhdGljIHU4IGFpcm9fZGJtX3RvX3BjdCAodGRzUnNzaUVudHJ5ICpyc3NpX3JpZCwgdTggZGJtKTsKKwogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2VuZGlmCiAKQEAgLTE3MTMsNiArMTcxNiw3IEBACiAJbGlzdC0+ZmguZHdlbGwgPSBsZTE2X3RvX2NwdShsaXN0LT5maC5kd2VsbCk7CiAJbGlzdC0+ZHNDaGFubmVsID0gbGUxNl90b19jcHUobGlzdC0+ZHNDaGFubmVsKTsKIAlsaXN0LT5hdGltV2luZG93ID0gbGUxNl90b19jcHUobGlzdC0+YXRpbVdpbmRvdyk7CisJbGlzdC0+ZEJtID0gbGUxNl90b19jcHUobGlzdC0+ZEJtKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTMyNDUsNyArMzI0OSwxMCBAQAogCQkJCQl3c3RhdHMubGV2ZWwgPSAweDEwMCAtIGFwcml2LT5yc3NpW2hkci5yc3NpWzFdXS5yc3NpZEJtOwogCQkJCWVsc2UKIAkJCQkJd3N0YXRzLmxldmVsID0gKGhkci5yc3NpWzFdICsgMzIxKSAvIDI7Ci0JCQkJd3N0YXRzLnVwZGF0ZWQgPSAzOwkKKwkJCQl3c3RhdHMubm9pc2UgPSBhcHJpdi0+d3N0YXRzLnF1YWwubm9pc2U7CisJCQkJd3N0YXRzLnVwZGF0ZWQgPSBJV19RVUFMX0xFVkVMX1VQREFURUQKKwkJCQkJfCBJV19RVUFMX1FVQUxfVVBEQVRFRAorCQkJCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAkJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KIAkJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgc2EsICZ3c3RhdHMpOwogCQkJfQpAQCAtMzU4OCw3ICszNTk1LDEwIEBACiAJCQl3c3RhdHMubGV2ZWwgPSAweDEwMCAtIGFpLT5yc3NpW2hkci5yc3NpWzFdXS5yc3NpZEJtOwogCQllbHNlCiAJCQl3c3RhdHMubGV2ZWwgPSAoaGRyLnJzc2lbMV0gKyAzMjEpIC8gMjsKLQkJd3N0YXRzLnVwZGF0ZWQgPSAzOworCQl3c3RhdHMubm9pc2UgPSBhaS0+d3N0YXRzLnF1YWwubm9pc2U7CisJCXdzdGF0cy51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQKKwkJCXwgSVdfUVVBTF9MRVZFTF9VUERBVEVECisJCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCiAJCXdpcmVsZXNzX3NweV91cGRhdGUoYWktPmRldiwgc2EsICZ3c3RhdHMpOwogCX0KQEAgLTM2NzksNyArMzY4OSw3IEBACiAJCXN0YXR1cyA9IFBDNDUwMF9yZWFkcmlkKGFpLFJJRF9SU1NJLCZyc3NpX3JpZCxzaXplb2YocnNzaV9yaWQpLGxvY2spOwogCQlpZiAoIHN0YXR1cyA9PSBTVUNDRVNTICkgewogCQkJaWYgKGFpLT5yc3NpIHx8IChhaS0+cnNzaSA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkKLQkJCQltZW1jcHkoYWktPnJzc2ksICh1OCopJnJzc2lfcmlkICsgMiwgNTEyKTsKKwkJCQltZW1jcHkoYWktPnJzc2ksICh1OCopJnJzc2lfcmlkICsgMiwgNTEyKTsgLyogU2tpcCBSSUQgbGVuZ3RoIG1lbWJlciAqLwogCQl9CiAJCWVsc2UgewogCQkJaWYgKGFpLT5yc3NpKSB7CkBAIC01MzQ4LDcgKzUzNTgsNyBAQAogCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbNV0sCiAJCQkJKGludClCU1NMaXN0X3JpZC5zc2lkTGVuLAogCQkJCUJTU0xpc3RfcmlkLnNzaWQsCi0JCQkJKGludClCU1NMaXN0X3JpZC5yc3NpKTsKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmRCbSk7CiAJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiBjaGFubmVsID0gJWQgJXMgJXMgJXMgJXNcbiIsCiAJCQkJKGludClCU1NMaXN0X3JpZC5kc0NoYW5uZWwsCiAJCQkJQlNTTGlzdF9yaWQuY2FwICYgQ0FQX0VTUyA/ICJFU1MiIDogIiIsCkBAIC01NTkzLDYgKzU2MDMsMjkgQEAKICAqIHdvdWxkIG5vdCB3b3JrIGF0IGFsbC4uLiAtIEplYW4gSUkKICAqLwogCitzdGF0aWMgdTggYWlyb19yc3NpX3RvX2RibSAodGRzUnNzaUVudHJ5ICpyc3NpX3JpZCwgdTggcnNzaSkKK3sKKwlpZiggIXJzc2lfcmlkICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKDB4MTAwIC0gcnNzaV9yaWRbcnNzaV0ucnNzaWRCbSk7Cit9CisKK3N0YXRpYyB1OCBhaXJvX2RibV90b19wY3QgKHRkc1Jzc2lFbnRyeSAqcnNzaV9yaWQsIHU4IGRibSkKK3sKKwlpbnQgaTsKKworCWlmKCAhcnNzaV9yaWQgKQorCQlyZXR1cm4gMDsKKworCWZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisJCWlmIChyc3NpX3JpZFtpXS5yc3NpZEJtID09IGRibSkKKwkJCXJldHVybiByc3NpX3JpZFtpXS5yc3NpcGN0OworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBhaXJvX2dldF9xdWFsaXR5IChTdGF0dXNSaWQgKnN0YXR1c19yaWQsIENhcGFiaWxpdHlSaWQgKmNhcF9yaWQpCiB7CiAJaW50IHF1YWxpdHkgPSAwOwpAQCAtNjQ0MywxMiArNjQ3NiwzMCBAQAogCX0KIAlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGs7CiAKLQkvKiBIdW0uLi4gU2hvdWxkIHB1dCB0aGUgcmlnaHQgdmFsdWVzIHRoZXJlICovCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBhaXJvX2dldF9tYXhfcXVhbGl0eSgmY2FwX3JpZCk7Ci0JcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMHgxMDAgLSAxMjA7CS8qIC0xMjAgZEJtICovCi0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKIAlyYW5nZS0+c2Vuc2l0aXZpdHkgPSA2NTUzNTsKIAorCS8qIEh1bS4uLiBTaG91bGQgcHV0IHRoZSByaWdodCB2YWx1ZXMgdGhlcmUgKi8KKwlpZiAobG9jYWwtPnJzc2kpCisJCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwkvKiAlICovCisJZWxzZQorCQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IGFpcm9fZ2V0X21heF9xdWFsaXR5KCZjYXBfcmlkKTsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOwkvKiAwIG1lYW5zIHdlIHVzZSBkQm0gICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDA7CisKKwkvKiBFeHBlcmltZW50YWwgbWVhc3VyZW1lbnRzIC0gYm91bmRhcnkgMTEvNS41IE1iL3MgKi8KKwkvKiBOb3RlIDogd2l0aCBvciB3aXRob3V0IHRoZSAobG9jYWwtPnJzc2kpLCByZXN1bHRzCisJICogYXJlIHNvbWV3aGF0IGRpZmZlcmVudC4gLSBKZWFuIElJICovCisJaWYgKGxvY2FsLT5yc3NpKSB7CisJCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNTA7CS8qICUgKi8KKwkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTg2OwkvKiAtNzAgZEJtICovCisJfSBlbHNlIHsKKwkJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSBhaXJvX2dldF9hdmdfcXVhbGl0eSgmY2FwX3JpZCk7CisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE3NjsJLyogLTgwIGRCbSAqLworCX0KKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gMDsKKwogCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CiAJCXJhbmdlLT5iaXRyYXRlW2ldID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSAqIDUwMDAwMDsKIAkJaWYocmFuZ2UtPmJpdHJhdGVbaV0gPT0gMCkKQEAgLTY1MDgsMTUgKzY1NTksNiBAQAogCXJhbmdlLT5tYXhfcmV0cnkgPSA2NTUzNTsKIAlyYW5nZS0+bWluX3JfdGltZSA9IDEwMjQ7CiAJcmFuZ2UtPm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMjQ7Ci0JLyogRXhwZXJpbWVudGFsIG1lYXN1cmVtZW50cyAtIGJvdW5kYXJ5IDExLzUuNSBNYi9zICovCi0JLyogTm90ZSA6IHdpdGggb3Igd2l0aG91dCB0aGUgKGxvY2FsLT5yc3NpKSwgcmVzdWx0cwotCSAqIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQuIC0gSmVhbiBJSSAqLwotCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gYWlyb19nZXRfYXZnX3F1YWxpdHkoJmNhcF9yaWQpOwotCWlmIChsb2NhbC0+cnNzaSkKLQkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTg2OwkvKiAtNzAgZEJtICovCi0JZWxzZQotCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAxNzY7CS8qIC04MCBkQm0gKi8KLQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCiAJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLwogCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwKQEAgLTY2NzYsMTIgKzY3MTgsMTggQEAKIAkJbG9zZVN5bmMgPSAwOwogCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBCU1NMaXN0LmJzc2lkLCBFVEhfQUxFTik7CiAJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQlpZiAobG9jYWwtPnJzc2kpCi0JCQlxdWFsW2ldLmxldmVsID0gMHgxMDAgLSBsb2NhbC0+cnNzaVtCU1NMaXN0LnJzc2ldLnJzc2lkQm07Ci0JCWVsc2UKLQkJCXF1YWxbaV0ubGV2ZWwgPSAoQlNTTGlzdC5yc3NpICsgMzIxKSAvIDI7Ci0JCXF1YWxbaV0ucXVhbCA9IHF1YWxbaV0ubm9pc2UgPSAwOwotCQlxdWFsW2ldLnVwZGF0ZWQgPSAyOworCQlpZiAobG9jYWwtPnJzc2kpIHsKKwkJCXF1YWxbaV0ubGV2ZWwgPSAweDEwMCAtIEJTU0xpc3QuZEJtOworCQkJcXVhbFtpXS5xdWFsID0gYWlyb19kYm1fdG9fcGN0KCBsb2NhbC0+cnNzaSwgQlNTTGlzdC5kQm0gKTsKKwkJCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEOworCQl9IGVsc2UgeworCQkJcXVhbFtpXS5sZXZlbCA9IChCU1NMaXN0LmRCbSArIDMyMSkgLyAyOworCQkJcXVhbFtpXS5xdWFsID0gMDsKKwkJCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElEOworCQl9CisJCXF1YWxbaV0ubm9pc2UgPSBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2U7CisJCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJCXwgSVdfUVVBTF9OT0lTRV9VUERBVEVEOwogCQlpZiAoQlNTTGlzdC5pbmRleCA9PSAweGZmZmYpCiAJCQlicmVhazsKIAl9CkBAIC02NzYwLDcgKzY4MDgsNyBAQAogc3RhdGljIGlubGluZSBjaGFyICphaXJvX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCWNoYXIgKmN1cnJlbnRfZXYsCiAJCQkJCWNoYXIgKmVuZF9idWYsCi0JCQkJCUJTU0xpc3RSaWQgKmxpc3QpCisJCQkJCUJTU0xpc3RSaWQgKmJzcykKIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgaXdfZXZlbnQJCWl3ZTsJCS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KQEAgLTY3NzEsMjIgKzY4MTksMjIgQEAKIAkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCiAJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBsaXN0LT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKIAljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwogCiAJLyogT3RoZXIgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCiAKIAkvKiBBZGQgdGhlIEVTU0lEICovCi0JaXdlLnUuZGF0YS5sZW5ndGggPSBsaXN0LT5zc2lkTGVuOworCWl3ZS51LmRhdGEubGVuZ3RoID0gYnNzLT5zc2lkTGVuOwogCWlmKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CiAJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKIAlpd2UudS5kYXRhLmZsYWdzID0gMTsKLQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGJzcy0+c3NpZCk7CiAKIAkvKiBBZGQgbW9kZSAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQljYXBhYmlsaXRpZXMgPSBsZTE2X3RvX2NwdShsaXN0LT5jYXApOworCWNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGJzcy0+Y2FwKTsKIAlpZihjYXBhYmlsaXRpZXMgJiAoQ0FQX0VTUyB8IENBUF9JQlNTKSkgewogCQlpZihjYXBhYmlsaXRpZXMgJiBDQVBfRVNTKQogCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOwpAQCAtNjc5NywxOSArNjg0NSwyNSBAQAogCiAJLyogQWRkIGZyZXF1ZW5jeSAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKLQlpd2UudS5mcmVxLm0gPSBsZTE2X3RvX2NwdShsaXN0LT5kc0NoYW5uZWwpOworCWl3ZS51LmZyZXEubSA9IGxlMTZfdG9fY3B1KGJzcy0+ZHNDaGFubmVsKTsKIAlpd2UudS5mcmVxLm0gPSBmcmVxdWVuY3lfbGlzdFtpd2UudS5mcmVxLm1dICogMTAwMDAwOwogCWl3ZS51LmZyZXEuZSA9IDE7CiAJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKIAogCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KIAlpd2UuY21kID0gSVdFVlFVQUw7Ci0JaWYgKGFpLT5yc3NpKQotCQlpd2UudS5xdWFsLmxldmVsID0gMHgxMDAgLSBhaS0+cnNzaVtsaXN0LT5yc3NpXS5yc3NpZEJtOwotCWVsc2UKLQkJaXdlLnUucXVhbC5sZXZlbCA9IChsaXN0LT5yc3NpICsgMzIxKSAvIDI7Ci0JaXdlLnUucXVhbC5ub2lzZSA9IDA7Ci0JaXdlLnUucXVhbC5xdWFsID0gMDsKKwlpZiAoYWktPnJzc2kpIHsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IDB4MTAwIC0gYnNzLT5kQm07CisJCWl3ZS51LnF1YWwucXVhbCA9IGFpcm9fZGJtX3RvX3BjdCggYWktPnJzc2ksIGJzcy0+ZEJtICk7CisJCWl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEOworCX0gZWxzZSB7CisJCWl3ZS51LnF1YWwubGV2ZWwgPSAoYnNzLT5kQm0gKyAzMjEpIC8gMjsKKwkJaXdlLnUucXVhbC5xdWFsID0gMDsKKwkJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJfQorCWl3ZS51LnF1YWwubm9pc2UgPSBhaS0+d3N0YXRzLnF1YWwubm9pc2U7CisJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9MRVZFTF9VUERBVEVECisJCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwogCiAJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLwpAQCAtNjgxOSw3ICs2ODczLDcgQEAKIAllbHNlCiAJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CiAJaXdlLnUuZGF0YS5sZW5ndGggPSAwOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBsaXN0LT5zc2lkKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYnNzLT5zc2lkKTsKIAogCS8qIFJhdGUgOiBzdHVmZmluZyBtdWx0aXBsZSB2YWx1ZXMgaW4gYSBzaW5nbGUgZXZlbnQgcmVxdWlyZSBhIGJpdAogCSAqIG1vcmUgb2YgbWFnaWMgLSBKZWFuIElJICovCkBAIC02ODMxLDEwICs2ODg1LDEwIEBACiAJLyogTWF4IDggdmFsdWVzICovCiAJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKIAkJLyogTlVMTCB0ZXJtaW5hdGVkICovCi0JCWlmKGxpc3QtPnJhdGVzW2ldID09IDApCisJCWlmKGJzcy0+cmF0ZXNbaV0gPT0gMCkKIAkJCWJyZWFrOwogCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLwotCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5yYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwKTsKKwkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgoYnNzLT5yYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwKTsKIAkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLwogCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOwogCX0KQEAgLTcxNTMsMTggKzcyMDcsMjIgQEAKIAkvKiBUaGUgc3RhdHVzICovCiAJbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBzdGF0dXNfcmlkLm1vZGU7CiAKLQkvKiBTaWduYWwgcXVhbGl0eSBhbmQgY28uIEJ1dCB3aGVyZSBpcyB0aGUgbm9pc2UgbGV2ZWwgPz8/ICovCi0JbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBhaXJvX2dldF9xdWFsaXR5KCZzdGF0dXNfcmlkLCAmY2FwX3JpZCk7Ci0JaWYgKGxvY2FsLT5yc3NpKQotCQlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSAweDEwMCAtIGxvY2FsLT5yc3NpW3N0YXR1c19yaWQuc2lnUXVhbGl0eV0ucnNzaWRCbTsKLQllbHNlCisJLyogU2lnbmFsIHF1YWxpdHkgYW5kIGNvICovCisJaWYgKGxvY2FsLT5yc3NpKSB7CisJCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IGFpcm9fcnNzaV90b19kYm0oIGxvY2FsLT5yc3NpLCBzdGF0dXNfcmlkLnNpZ1F1YWxpdHkgKTsKKwkJLyogbm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoIGFwcGVhcnMgdG8gYmUgYSBwZXJjZW50YWdlICovCisJCWxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gc3RhdHVzX3JpZC5ub3JtYWxpemVkU2lnbmFsU3RyZW5ndGg7CisJfSBlbHNlIHsKIAkJbG9jYWwtPndzdGF0cy5xdWFsLmxldmVsID0gKHN0YXR1c19yaWQubm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoICsgMzIxKSAvIDI7CisJCWxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gYWlyb19nZXRfcXVhbGl0eSgmc3RhdHVzX3JpZCwgJmNhcF9yaWQpOworCX0KKwlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEOwogCWlmIChzdGF0dXNfcmlkLmxlbiA+PSAxMjQpIHsKLQkJbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gMjU2IC0gc3RhdHVzX3JpZC5ub2lzZWRCbTsKLQkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSA3OworCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAweDEwMCAtIHN0YXR1c19yaWQubm9pc2VkQm07CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAl9IGVsc2UgewogCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOwotCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDM7CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKIAl9CiAKIAkvKiBQYWNrZXRzIGRpc2NhcmRlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8gd2lyZWxlc3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IGE5MWI1MDcuLmE0ZWQyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtMzIxLDYgKzMyMSw3IEBACiAJeyAweDAxYmYsIDB4MzMwMiwgTlVMTCwgQVRNRUxfRldfVFlQRV81MDJFLCAiQmVsa2luIEY1RDYwMjAtVjIiIH0sIAogCXsgMCwgMCwgIkJUL1ZveWFnZXIgMTAyMCBMYXB0b3AgQWRhcHRlciIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiQlQgVm95YWdlciAxMDIwIiB9LAogCXsgMCwgMCwgIklFRUUgODAyLjExYi9XaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiU2llbWVucyBHaWdhc2V0IFBDIENhcmQgSUkiIH0sCisJeyAwLCAwLCAiSUVFRSA4MDIuMTFiL1dpcmVsZXNzIExBTiBDYXJkIFMiLCBBVE1FTF9GV19UWVBFXzUwNF8yOTU4LCAiU2llbWVucyBHaWdhc2V0IFBDIENhcmQgSUkiIH0sCiAJeyAwLCAwLCAiQ05ldC9DTldMQyAxMU1icHMgV2lyZWxlc3MgUEMgQ2FyZCBWLTUiLCBBVE1FTF9GV19UWVBFXzUwMkUsICJDTmV0IENOV0xDLTgxMUFSTCIgfSwKIAl7IDAsIDAsICJXaXJlbGVzcy9QQ19DQVJEIiwgQVRNRUxfRldfVFlQRV81MDJELCAiUGxhbmV0IFdMLTM1NTIiIH0sCiAJeyAwLCAwLCAiT0VNLzExTWJwcyBXaXJlbGVzcyBMQU4gUEMgQ2FyZCBWLTMiLCBBVE1FTF9GV19UWVBFXzUwMiwgIk9FTSAxMU1icHMgV0xBTiBQQ01DSUEgQ2FyZCIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwppbmRleCAwMjFkMGY3Li4zOTAzZjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy5jCkBAIC01MiwxMTYgKzUyLDE3IEBACiAJaWYgKChidWZmZXJfc2l6ZSAtIGxlbmd0aCA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZW52cFtpKytdID0gc2NyYXRjaDsKKwlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwKKwkJCSAgICAiTU9EQUxJQVM9cGNpOnYlMDhYZCUwOFhzdiUwOFhzZCUwOFhiYyUwMlhzYyUwMlhpJTAyeFxuIiwKKwkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLAorCQkJICAgICh1OCkocGRldi0+Y2xhc3MpKTsKKwlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAllbnZwW2ldID0gTlVMTDsKIAogCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW50IHBjaV92aXNpdF9idXMgKHN0cnVjdCBwY2lfdmlzaXQgKiBmbiwgc3RydWN0IHBjaV9idXNfd3JhcHBlZCAqd3JhcHBlZF9idXMsIHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKndyYXBwZWRfcGFyZW50KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmxuOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9kZXZfd3JhcHBlZCB3cmFwcGVkX2RldjsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCJQQ0k6IFNjYW5uaW5nIGJ1cyAlMDR4OiUwMnhcbiIsIHBjaV9kb21haW5fbnIod3JhcHBlZF9idXMtPmJ1cyksCi0JCXdyYXBwZWRfYnVzLT5idXMtPm51bWJlcik7Ci0KLQlpZiAoZm4tPnByZV92aXNpdF9wY2lfYnVzKSB7Ci0JCXJlc3VsdCA9IGZuLT5wcmVfdmlzaXRfcGNpX2J1cyh3cmFwcGVkX2J1cywgd3JhcHBlZF9wYXJlbnQpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlsbiA9IHdyYXBwZWRfYnVzLT5idXMtPmRldmljZXMubmV4dDsgCi0Jd2hpbGUgKGxuICE9ICZ3cmFwcGVkX2J1cy0+YnVzLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHBjaV9kZXZfYihsbik7Ci0JCWxuID0gbG4tPm5leHQ7Ci0KLQkJbWVtc2V0KCZ3cmFwcGVkX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQpKTsKLQkJd3JhcHBlZF9kZXYuZGV2ID0gZGV2OwotCi0JCXJlc3VsdCA9IHBjaV92aXNpdF9kZXYoZm4sICZ3cmFwcGVkX2Rldiwgd3JhcHBlZF9idXMpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlpZiAoZm4tPnBvc3RfdmlzaXRfcGNpX2J1cykKLQkJcmVzdWx0ID0gZm4tPnBvc3RfdmlzaXRfcGNpX2J1cyh3cmFwcGVkX2J1cywgd3JhcHBlZF9wYXJlbnQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBwY2lfdmlzaXRfYnJpZGdlIChzdHJ1Y3QgcGNpX3Zpc2l0ICogZm4sCi0JCQkgICAgIHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKndyYXBwZWRfZGV2LAotCQkJICAgICBzdHJ1Y3QgcGNpX2J1c193cmFwcGVkICp3cmFwcGVkX3BhcmVudCkKLXsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCXN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgd3JhcHBlZF9idXM7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcl9kZWJ1ZygiUENJOiBTY2FubmluZyBicmlkZ2UgJXNcbiIsIHBjaV9uYW1lKHdyYXBwZWRfZGV2LT5kZXYpKTsKLQotCWlmIChmbi0+dmlzaXRfcGNpX2RldikgewotCQlyZXN1bHQgPSBmbi0+dmlzaXRfcGNpX2Rldih3cmFwcGVkX2Rldiwgd3JhcHBlZF9wYXJlbnQpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlidXMgPSB3cmFwcGVkX2Rldi0+ZGV2LT5zdWJvcmRpbmF0ZTsKLQlpZiAoYnVzKSB7Ci0JCW1lbXNldCgmd3JhcHBlZF9idXMsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX2J1c193cmFwcGVkKSk7Ci0JCXdyYXBwZWRfYnVzLmJ1cyA9IGJ1czsKLQotCQlyZXN1bHQgPSBwY2lfdmlzaXRfYnVzKGZuLCAmd3JhcHBlZF9idXMsIHdyYXBwZWRfZGV2KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBwY2lfdmlzaXRfZGV2IC0gc2NhbnMgdGhlIHBjaSBidXNlcy4KLSAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB3aGlsZSB2aXNpdGluZwotICogQHdyYXBwZWRfZGV2OiB0aGUgZGV2aWNlIHRvIHNjYW4KLSAqIEB3cmFwcGVkX3BhcmVudDogdGhlIGJ1cyB3aGVyZSBAd3JhcHBlZF9kZXYgaXMgY29ubmVjdGVkIHRvCi0gKgotICogRXZlcnkgYnVzIGFuZCBldmVyeSBmdW5jdGlvbiBpcyBwcmVzZW50ZWQgdG8gYSBjdXN0b20KLSAqIGZ1bmN0aW9uIHRoYXQgY2FuIGFjdCB1cG9uIGl0LgotICovCi1pbnQgcGNpX3Zpc2l0X2RldihzdHJ1Y3QgcGNpX3Zpc2l0ICpmbiwgc3RydWN0IHBjaV9kZXZfd3JhcHBlZCAqd3JhcHBlZF9kZXYsCi0JCSAgc3RydWN0IHBjaV9idXNfd3JhcHBlZCAqd3JhcHBlZF9wYXJlbnQpCi17Ci0Jc3RydWN0IHBjaV9kZXYqIGRldiA9IHdyYXBwZWRfZGV2ID8gd3JhcHBlZF9kZXYtPmRldiA6IE5VTEw7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZm4tPnByZV92aXNpdF9wY2lfZGV2KSB7Ci0JCXJlc3VsdCA9IGZuLT5wcmVfdmlzaXRfcGNpX2Rldih3cmFwcGVkX2Rldiwgd3JhcHBlZF9wYXJlbnQpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzd2l0Y2ggKGRldi0+Y2xhc3MgPj4gOCkgewotCQljYXNlIFBDSV9DTEFTU19CUklER0VfUENJOgotCQkJcmVzdWx0ID0gcGNpX3Zpc2l0X2JyaWRnZShmbiwgd3JhcHBlZF9kZXYsCi0JCQkJCQkgIHdyYXBwZWRfcGFyZW50KTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZGVidWcoIlBDSTogU2Nhbm5pbmcgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJCWlmIChmbi0+dmlzaXRfcGNpX2RldikgewotCQkJCXJlc3VsdCA9IGZuLT52aXNpdF9wY2lfZGV2ICh3cmFwcGVkX2RldiwKLQkJCQkJCQkgICAgd3JhcHBlZF9wYXJlbnQpOwotCQkJCWlmIChyZXN1bHQpCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JfQotCi0JaWYgKGZuLT5wb3N0X3Zpc2l0X3BjaV9kZXYpCi0JCXJlc3VsdCA9IGZuLT5wb3N0X3Zpc2l0X3BjaV9kZXYod3JhcHBlZF9kZXYsIHdyYXBwZWRfcGFyZW50KTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV92aXNpdF9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWcuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnLmgKaW5kZXggM2RkZDc1OS4uZDk3NjliMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWcuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Zy5oCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotLyogUElDTUcgMi4xMiBSMi4wIEhTIENTUiBiaXRzOiAqLworLyogUElDTUcgMi4xIFIyLjAgSFMgQ1NSIGJpdHM6ICovCiAjZGVmaW5lIEhTX0NTUl9JTlMJMHgwMDgwCiAjZGVmaW5lIEhTX0NTUl9FWFQJMHgwMDQwCiAjZGVmaW5lIEhTX0NTUl9QSQkweDAwMzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCBlZDI0MzYwLi45ZTlkYWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfY29yZS5jCkBAIC0zMywxMSArMzMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgImNwY2lfaG90cGx1Zy5oIgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjIiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIlNjb3R0IE11cnJheSA8c2NvdHRtQHNvbWFuZXR3b3Jrcy5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQwkiQ29tcGFjdFBDSSBIb3QgUGx1ZyBDb3JlIgogCkBAIC01NCw5ICs1NCwxMCBAQAogI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogIiBmb3JtYXQgIlxuIiwgTVlfTkFNRSAsICMjIGFyZykKIAogLyogbG9jYWwgdmFyaWFibGVzICovCi1zdGF0aWMgc3BpbmxvY2tfdCBsaXN0X2xvY2s7CitzdGF0aWMgREVDTEFSRV9SV1NFTShsaXN0X3J3c2VtKTsKIHN0YXRpYyBMSVNUX0hFQUQoc2xvdF9saXN0KTsKIHN0YXRpYyBpbnQgc2xvdHM7CitzdGF0aWMgYXRvbWljX3QgZXh0cmFjdGluZzsKIGludCBjcGNpX2RlYnVnOwogc3RhdGljIHN0cnVjdCBjcGNpX2hwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBldmVudF9zZW1hcGhvcmU7CS8qIG11dGV4IGZvciBwcm9jZXNzIGxvb3AgKHVwIGlmIHNvbWV0aGluZyB0byBwcm9jZXNzKSAqLwpAQCAtNjgsNiArNjksOCBAQAogc3RhdGljIGludCBzZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCB2YWx1ZSk7CiBzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKiB2YWx1ZSk7CiBzdGF0aWMgaW50IGdldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4ICogdmFsdWUpOworc3RhdGljIGludCBnZXRfYWRhcHRlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKiB2YWx1ZSk7CitzdGF0aWMgaW50IGdldF9sYXRjaF9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKiB2YWx1ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyBjcGNpX2hvdHBsdWdfc2xvdF9vcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC03Niw2ICs3OSw4IEBACiAJLnNldF9hdHRlbnRpb25fc3RhdHVzID0gc2V0X2F0dGVudGlvbl9zdGF0dXMsCiAJLmdldF9wb3dlcl9zdGF0dXMgPSBnZXRfcG93ZXJfc3RhdHVzLAogCS5nZXRfYXR0ZW50aW9uX3N0YXR1cyA9IGdldF9hdHRlbnRpb25fc3RhdHVzLAorCS5nZXRfYWRhcHRlcl9zdGF0dXMgPSBnZXRfYWRhcHRlcl9zdGF0dXMsCisJLmdldF9sYXRjaF9zdGF0dXMgPSBnZXRfbGF0Y2hfc3RhdHVzLAogfTsKIAogc3RhdGljIGludApAQCAtMTQ4LDggKzE1MywxMCBAQAogCQl3YXJuKCJmYWlsdXJlIHRvIHVwZGF0ZSBhZGFwdGVyIGZpbGUiKTsKIAl9CiAKLQlzbG90LT5leHRyYWN0aW5nID0gMDsKLQorCWlmKHNsb3QtPmV4dHJhY3RpbmcpIHsKKwkJc2xvdC0+ZXh0cmFjdGluZyA9IDA7CisJCWF0b21pY19kZWMoJmV4dHJhY3RpbmcpOworCX0KIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xODgsNiArMTk1LDIwIEBACiAJcmV0dXJuIGNwY2lfc2V0X2F0dGVudGlvbl9zdGF0dXMoaG90cGx1Z19zbG90LT5wcml2YXRlLCBzdGF0dXMpOwogfQogCitzdGF0aWMgaW50CitnZXRfYWRhcHRlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQoreworCSp2YWx1ZSA9IGhvdHBsdWdfc2xvdC0+aW5mby0+YWRhcHRlcl9zdGF0dXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9sYXRjaF9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqIHZhbHVlKQoreworCSp2YWx1ZSA9IGhvdHBsdWdfc2xvdC0+aW5mby0+bGF0Y2hfc3RhdHVzOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCByZWxlYXNlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90KQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gaG90cGx1Z19zbG90LT5wcml2YXRlOwpAQCAtMjczLDEwICsyOTQsMTAgQEAKIAkJfQogCiAJCS8qIEFkZCBzbG90IHRvIG91ciBpbnRlcm5hbCBsaXN0ICovCi0JCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwkJZG93bl93cml0ZSgmbGlzdF9yd3NlbSk7CiAJCWxpc3RfYWRkKCZzbG90LT5zbG90X2xpc3QsICZzbG90X2xpc3QpOwogCQlzbG90cysrOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJdXBfd3JpdGUoJmxpc3RfcndzZW0pOwogCX0KIAlyZXR1cm4gMDsKIGVycm9yX25hbWU6CkBAIC0yOTksOSArMzIwLDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJZG93bl93cml0ZSgmbGlzdF9yd3NlbSk7CiAJaWYoIXNsb3RzKSB7Ci0JCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQl1cF93cml0ZSgmbGlzdF9yd3NlbSk7CiAJCXJldHVybiAtMTsKIAl9CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbmV4dCwgJnNsb3RfbGlzdCkgewpAQCAtMzE5LDcgKzM0MCw3IEBACiAJCQlzbG90cy0tOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXVwX3dyaXRlKCZsaXN0X3J3c2VtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ3LDcgKzM2OCw3IEBACiB9CiAKIC8qCi0gKiBBY2NvcmRpbmcgdG8gUElDTUcgMi4xMiBSMi4wLCBzZWN0aW9uIDYuMy4yLCB1cG9uCisgKiBBY2NvcmRpbmcgdG8gUElDTUcgMi4xIFIyLjAsIHNlY3Rpb24gNi4zLjIsIHVwb24KICAqIGluaXRpYWxpemF0aW9uLCB0aGUgc3lzdGVtIGRyaXZlciBzaGFsbCBjbGVhciB0aGUKICAqIElOUyBiaXRzIG9mIHRoZSBjb2xkLWluc2VydGVkIGRldmljZXMuCiAgKi8KQEAgLTM1OSw5ICszODAsOSBAQAogCXN0cnVjdCBwY2lfZGV2KiBkZXY7CiAKIAlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOwotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlkb3duX3JlYWQoJmxpc3RfcndzZW0pOwogCWlmKCFzbG90cykgewotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJdXBfcmVhZCgmbGlzdF9yd3NlbSk7CiAJCXJldHVybiAtMTsKIAl9CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZzbG90X2xpc3QpIHsKQEAgLTM4Niw3ICs0MDcsNyBAQAogCQkJfQogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXVwX3JlYWQoJmxpc3RfcndzZW0pOwogCWRiZygiJXMgLSBleGl0IiwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5OCwxMCArNDE5LDExIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBleHRyYWN0ZWQ7CiAJaW50IGluc2VydGVkOworCXUxNiBoc19jc3I7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJZG93bl9yZWFkKCZsaXN0X3J3c2VtKTsKIAlpZighc2xvdHMpIHsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCXVwX3JlYWQoJmxpc3RfcndzZW0pOwogCQllcnIoIm5vIHNsb3RzIHJlZ2lzdGVyZWQsIHNodXR0aW5nIGRvd24iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQxMSw4ICs0MzMsNiBAQAogCQlkYmcoIiVzIC0gbG9va2luZyBhdCBzbG90ICVzIiwKIAkJICAgIF9fRlVOQ1RJT05fXywgc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKIAkJaWYoY3BjaV9jaGVja19hbmRfY2xlYXJfaW5zKHNsb3QpKSB7Ci0JCQl1MTYgaHNfY3NyOwotCiAJCQkvKiBTb21lIGJyb2tlbiBoYXJkd2FyZSAoZS5nLiBQTFggOTA1NEFCKSBhc3NlcnRzIEVOVU0jIHR3aWNlLi4uICovCiAJCQlpZihzbG90LT5kZXYpIHsKIAkJCQl3YXJuKCJzbG90ICVzIGFscmVhZHkgaW5zZXJ0ZWQiLCBzbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUpOwpAQCAtNDYyLDggKzQ4Miw2IEBACiAKIAkJCWluc2VydGVkKys7CiAJCX0gZWxzZSBpZihjcGNpX2NoZWNrX2V4dChzbG90KSkgewotCQkJdTE2IGhzX2NzcjsKLQogCQkJLyogUHJvY2VzcyBleHRyYWN0aW9uIHJlcXVlc3QgKi8KIAkJCWRiZygiJXMgLSBzbG90ICVzIGV4dHJhY3RlZCIsCiAJCQkgICAgX19GVU5DVElPTl9fLCBzbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUpOwpAQCAtNDc2LDIwICs0OTQsNDAgQEAKIAkJCWlmKCFzbG90LT5leHRyYWN0aW5nKSB7CiAJCQkJaWYodXBkYXRlX2xhdGNoX3N0YXR1cyhzbG90LT5ob3RwbHVnX3Nsb3QsIDApKSB7CiAJCQkJCXdhcm4oImZhaWx1cmUgdG8gdXBkYXRlIGxhdGNoIGZpbGUiKTsKKwogCQkJCX0KKwkJCQlhdG9taWNfaW5jKCZleHRyYWN0aW5nKTsKIAkJCQlzbG90LT5leHRyYWN0aW5nID0gMTsKIAkJCX0KIAkJCWV4dHJhY3RlZCsrOworCQl9IGVsc2UgaWYoc2xvdC0+ZXh0cmFjdGluZykgeworCQkJaHNfY3NyID0gY3BjaV9nZXRfaHNfY3NyKHNsb3QpOworCQkJaWYoaHNfY3NyID09IDB4ZmZmZikgeworCQkJCS8qCisJCQkJICogSG1tbSwgd2UncmUgbGlrZWx5IGhvc2VkIGF0IHRoaXMgcG9pbnQsIHNob3VsZCB3ZQorCQkJCSAqIGJvdGhlciB0cnlpbmcgdG8gdGVsbCB0aGUgZHJpdmVyIG9yIG5vdD8KKwkJCQkgKi8KKwkJCQllcnIoImNhcmQgaW4gc2xvdCAlcyB3YXMgaW1wcm9wZXJseSByZW1vdmVkIiwKKwkJCQkgICAgc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKKwkJCQlpZih1cGRhdGVfYWRhcHRlcl9zdGF0dXMoc2xvdC0+aG90cGx1Z19zbG90LCAwKSkgeworCQkJCQl3YXJuKCJmYWlsdXJlIHRvIHVwZGF0ZSBhZGFwdGVyIGZpbGUiKTsKKwkJCQl9CisJCQkJc2xvdC0+ZXh0cmFjdGluZyA9IDA7CisJCQkJYXRvbWljX2RlYygmZXh0cmFjdGluZyk7CisJCQl9CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJdXBfcmVhZCgmbGlzdF9yd3NlbSk7CisJZGJnKCJpbnNlcnRlZD0lZCwgZXh0cmFjdGVkPSVkLCBleHRyYWN0aW5nPSVkIiwKKwkgICAgaW5zZXJ0ZWQsIGV4dHJhY3RlZCwgYXRvbWljX3JlYWQoJmV4dHJhY3RpbmcpKTsKIAlpZihpbnNlcnRlZCB8fCBleHRyYWN0ZWQpIHsKIAkJcmV0dXJuIGV4dHJhY3RlZDsKIAl9Ci0JZWxzZSB7CisJZWxzZSBpZighYXRvbWljX3JlYWQoJmV4dHJhY3RpbmcpKSB7CiAJCWVycigiY2Fubm90IGZpbmQgRU5VTSMgc291cmNlLCBzaHV0dGluZyBkb3duIik7CiAJCXJldHVybiAtMTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgaXMgdGhlIGludGVycnVwdCBtb2RlIHdvcmtlciB0aHJlYWQgYm9keSAqLwpAQCAtNDk3LDggKzUzNSw2IEBACiBldmVudF90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlpbnQgcmM7Ci0Jc3RydWN0IHNsb3QgKnNsb3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJbG9ja19rZXJuZWwoKTsKIAlkYWVtb25pemUoImNwY2lfaHBfZXZlbnRkIik7CkBAIC01MTIsMzkgKzU0OCwyMiBAQAogCQkgICAgdGhyZWFkX2ZpbmlzaGVkKTsKIAkJaWYodGhyZWFkX2ZpbmlzaGVkIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7Ci0JCXdoaWxlKGNvbnRyb2xsZXItPm9wcy0+cXVlcnlfZW51bSgpKSB7CisJCWRvIHsKIAkJCXJjID0gY2hlY2tfc2xvdHMoKTsKLQkJCWlmIChyYyA+IDApCisJCQlpZiAocmMgPiAwKSB7CiAJCQkJLyogR2l2ZSB1c2Vyc3BhY2UgYSBjaGFuY2UgdG8gaGFuZGxlIGV4dHJhY3Rpb24gKi8KIAkJCQltc2xlZXAoNTAwKTsKLQkJCWVsc2UgaWYgKHJjIDwgMCkgeworCQkJfSBlbHNlIGlmIChyYyA8IDApIHsKIAkJCQlkYmcoIiVzIC0gZXJyb3IgY2hlY2tpbmcgc2xvdHMiLCBfX0ZVTkNUSU9OX18pOwogCQkJCXRocmVhZF9maW5pc2hlZCA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0KLQkJLyogQ2hlY2sgZm9yIHNvbWVvbmUgeWFua2luZyBvdXQgYSBib2FyZCAqLwotCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnNsb3RfbGlzdCkgewotCQkJc2xvdCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3Qgc2xvdCwgc2xvdF9saXN0KTsKLQkJCWlmKHNsb3QtPmV4dHJhY3RpbmcpIHsKLQkJCQkvKgotCQkJCSAqIEhtbW0sIHdlJ3JlIGxpa2VseSBob3NlZCBhdCB0aGlzIHBvaW50LCBzaG91bGQgd2UKLQkJCQkgKiBib3RoZXIgdHJ5aW5nIHRvIHRlbGwgdGhlIGRyaXZlciBvciBub3Q/Ci0JCQkJICovCi0JCQkJZXJyKCJjYXJkIGluIHNsb3QgJXMgd2FzIGltcHJvcGVybHkgcmVtb3ZlZCIsCi0JCQkJICAgIHNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSk7Ci0JCQkJaWYodXBkYXRlX2FkYXB0ZXJfc3RhdHVzKHNsb3QtPmhvdHBsdWdfc2xvdCwgMCkpIHsKLQkJCQkJd2FybigiZmFpbHVyZSB0byB1cGRhdGUgYWRhcHRlciBmaWxlIik7Ci0JCQkJfQotCQkJCXNsb3QtPmV4dHJhY3RpbmcgPSAwOwotCQkJfQotCQl9CisJCX0gd2hpbGUoYXRvbWljX3JlYWQoJmV4dHJhY3RpbmcpICE9IDApOwogCiAJCS8qIFJlLWVuYWJsZSBFTlVNIyBpbnRlcnJ1cHQgKi8KIAkJZGJnKCIlcyAtIHJlLWVuYWJsaW5nIGlycSIsIF9fRlVOQ1RJT05fXyk7CiAJCWNvbnRyb2xsZXItPm9wcy0+ZW5hYmxlX2lycSgpOwogCX0KLQogCWRiZygiJXMgLSBldmVudCB0aHJlYWQgc2lnbmFscyBleGl0IiwgX19GVU5DVElPTl9fKTsKIAl1cCgmdGhyZWFkX2V4aXQpOwogCXJldHVybiAwOwpAQCAtNTU1LDggKzU3NCw2IEBACiBwb2xsX3RocmVhZCh2b2lkICpkYXRhKQogewogCWludCByYzsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlsb2NrX2tlcm5lbCgpOwogCWRhZW1vbml6ZSgiY3BjaV9ocF9wb2xsZCIpOwpAQCAtNTY1LDM1ICs1ODIsMTkgQEAKIAl3aGlsZSgxKSB7CiAJCWlmKHRocmVhZF9maW5pc2hlZCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwotCi0JCXdoaWxlKGNvbnRyb2xsZXItPm9wcy0+cXVlcnlfZW51bSgpKSB7Ci0JCQlyYyA9IGNoZWNrX3Nsb3RzKCk7Ci0JCQlpZihyYyA+IDApCi0JCQkJLyogR2l2ZSB1c2Vyc3BhY2UgYSBjaGFuY2UgdG8gaGFuZGxlIGV4dHJhY3Rpb24gKi8KLQkJCQltc2xlZXAoNTAwKTsKLQkJCWVsc2UgaWYgKHJjIDwgMCkgewotCQkJCWRiZygiJXMgLSBlcnJvciBjaGVja2luZyBzbG90cyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJdGhyZWFkX2ZpbmlzaGVkID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBDaGVjayBmb3Igc29tZW9uZSB5YW5raW5nIG91dCBhIGJvYXJkICovCi0JCWxpc3RfZm9yX2VhY2godG1wLCAmc2xvdF9saXN0KSB7Ci0JCQlzbG90ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBzbG90X2xpc3QpOwotCQkJaWYoc2xvdC0+ZXh0cmFjdGluZykgewotCQkJCS8qCi0JCQkJICogSG1tbSwgd2UncmUgbGlrZWx5IGhvc2VkIGF0IHRoaXMgcG9pbnQsIHNob3VsZCB3ZQotCQkJCSAqIGJvdGhlciB0cnlpbmcgdG8gdGVsbCB0aGUgZHJpdmVyIG9yIG5vdD8KLQkJCQkgKi8KLQkJCQllcnIoImNhcmQgaW4gc2xvdCAlcyB3YXMgaW1wcm9wZXJseSByZW1vdmVkIiwKLQkJCQkgICAgc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKLQkJCQlpZih1cGRhdGVfYWRhcHRlcl9zdGF0dXMoc2xvdC0+aG90cGx1Z19zbG90LCAwKSkgewotCQkJCQl3YXJuKCJmYWlsdXJlIHRvIHVwZGF0ZSBhZGFwdGVyIGZpbGUiKTsKKwkJaWYoY29udHJvbGxlci0+b3BzLT5xdWVyeV9lbnVtKCkpIHsKKwkJCWRvIHsKKwkJCQlyYyA9IGNoZWNrX3Nsb3RzKCk7CisJCQkJaWYocmMgPiAwKSB7CisJCQkJCS8qIEdpdmUgdXNlcnNwYWNlIGEgY2hhbmNlIHRvIGhhbmRsZSBleHRyYWN0aW9uICovCisJCQkJCW1zbGVlcCg1MDApOworCQkJCX0gZWxzZSBpZihyYyA8IDApIHsKKwkJCQkJZGJnKCIlcyAtIGVycm9yIGNoZWNraW5nIHNsb3RzIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJdGhyZWFkX2ZpbmlzaGVkID0gMTsKKwkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXNsb3QtPmV4dHJhY3RpbmcgPSAwOwotCQkJfQorCQkJfSB3aGlsZShhdG9taWNfcmVhZCgmZXh0cmFjdGluZykgIT0gMCk7CiAJCX0KLQogCQltc2xlZXAoMTAwKTsKIAl9CiAJZGJnKCJwb2xsIHRocmVhZCBzaWduYWxzIGV4aXQiKTsKQEAgLTY2Nyw2ICs2NjgsOSBAQAogCWludCBzdGF0dXMgPSAwOwogCiAJaWYoY29udHJvbGxlcikgeworCQlpZihhdG9taWNfcmVhZCgmZXh0cmFjdGluZykgIT0gMCkgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQogCQlpZighdGhyZWFkX2ZpbmlzaGVkKSB7CiAJCQljcGNpX3N0b3BfdGhyZWFkKCk7CiAJCX0KQEAgLTY5MSwxMiArNjk1LDEyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKLQlpZighc2xvdHMpIHsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJZG93bl9yZWFkKCZsaXN0X3J3c2VtKTsKKwlpZihsaXN0X2VtcHR5KCZzbG90X2xpc3QpKSB7CisJCXVwX3JlYWQoJmxpc3RfcndzZW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJdXBfcmVhZCgmbGlzdF9yd3NlbSk7CiAKIAlpZihmaXJzdCkgewogCQlzdGF0dXMgPSBpbml0X3Nsb3RzKCk7CkBAIC03MjcsNyArNzMxLDkgQEAKIAlpZighY29udHJvbGxlcikgewogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0KKwlpZihhdG9taWNfcmVhZCgmZXh0cmFjdGluZykgIT0gMCkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KIAlpZihjb250cm9sbGVyLT5pcnEpIHsKIAkJLyogU3RvcCBlbnVtIGludGVycnVwdCBwcm9jZXNzaW5nICovCiAJCWRiZygiJXMgLSBkaXNhYmxpbmcgaXJxIiwgX19GVU5DVElPTl9fKTsKQEAgLTc0Nyw3ICs3NTMsNyBAQAogCSAqIFVucmVnaXN0ZXIgYWxsIG9mIG91ciBzbG90cyB3aXRoIHRoZSBwY2lfaG90cGx1ZyBzdWJzeXN0ZW0sCiAJICogYW5kIGZyZWUgdXAgYWxsIG1lbW9yeSB0aGF0IHdlIGhhZCBhbGxvY2F0ZWQuCiAJICovCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCWRvd25fd3JpdGUoJmxpc3RfcndzZW0pOwogCWlmKCFzbG90cykgewogCQlnb3RvIG51bGxfY2xlYW51cDsKIAl9CkBAIC03NjEsMTcgKzc2NywxNCBAQAogCQlrZnJlZShzbG90KTsKIAl9CiAgICAgICBudWxsX2NsZWFudXA6Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJdXBfd3JpdGUoJmxpc3RfcndzZW0pOwogCXJldHVybjsKIH0KIAogaW50IF9faW5pdAogY3BjaV9ob3RwbHVnX2luaXQoaW50IGRlYnVnKQogewotCXNwaW5fbG9ja19pbml0KCZsaXN0X2xvY2spOwogCWNwY2lfZGVidWcgPSBkZWJ1ZzsKLQotCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwppbmRleCAyZTk2OTYxLi42OWViNGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwpAQCAtMzIsMTEgKzMyLDcgQEAKICNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgImNwY2lfaG90cGx1Zy5oIgogCi0jaWYgIWRlZmluZWQoTU9EVUxFKQogI2RlZmluZSBNWV9OQU1FCSJjcGNpX2hvdHBsdWciCi0jZWxzZQotI2RlZmluZSBNWV9OQU1FCVRISVNfTU9EVUxFLT5uYW1lCi0jZW5kaWYKIAogZXh0ZXJuIGludCBjcGNpX2RlYnVnOwogCkBAIC0xMjcsMzggKzEyMyw2IEBACiAJcmV0dXJuIGhzX2NzcjsKIH0KIAotI2lmIDAKLXUxNiBjcGNpX3NldF9oc19jc3Ioc3RydWN0IHNsb3QqIHNsb3QsIHUxNiBoc19jc3IpCi17Ci0JaW50IGhzX2NhcDsKLQl1MTYgbmV3X2hzX2NzcjsKLQotCWhzX2NhcCA9IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5KHNsb3QtPmJ1cywKLQkJCQkJIHNsb3QtPmRldmZuLAotCQkJCQkgUENJX0NBUF9JRF9DSFNXUCk7Ci0JaWYoIWhzX2NhcCkgewotCQlyZXR1cm4gMHhGRkZGOwotCX0KLQotCS8qIFdyaXRlIG91dCB0aGUgbmV3IHZhbHVlICovCi0JaWYocGNpX2J1c193cml0ZV9jb25maWdfd29yZChzbG90LT5idXMsCi0JCQkJICAgICAgc2xvdC0+ZGV2Zm4sCi0JCQkJICAgICAgaHNfY2FwICsgMiwKLQkJCQkgICAgICBoc19jc3IpKSB7Ci0JCXJldHVybiAweEZGRkY7Ci0JfQotCi0JLyogUmVhZCBiYWNrIHdoYXQgd2UganVzdCB3cm90ZSBvdXQgKi8KLQlpZihwY2lfYnVzX3JlYWRfY29uZmlnX3dvcmQoc2xvdC0+YnVzLAotCQkJCSAgICAgc2xvdC0+ZGV2Zm4sCi0JCQkJICAgICBoc19jYXAgKyAyLAotCQkJCSAgICAgJm5ld19oc19jc3IpKSB7Ci0JCXJldHVybiAweEZGRkY7Ci0JfQotCXJldHVybiBuZXdfaHNfY3NyOwotfQotI2VuZGlmCi0KIGludCBjcGNpX2NoZWNrX2FuZF9jbGVhcl9pbnMoc3RydWN0IHNsb3QqIHNsb3QpCiB7CiAJaW50IGhzX2NhcDsKQEAgLTI2MSw3ICsyMjUsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYoKGhzX2NzciAmIEhTX0NTUl9MT08pICE9IEhTX0NTUl9MT08pIHsKLQkJLyogU2V0IExPTyAqLwogCQloc19jc3IgfD0gSFNfQ1NSX0xPTzsKIAkJaWYocGNpX2J1c193cml0ZV9jb25maWdfd29yZChzbG90LT5idXMsCiAJCQkJCSAgICAgIHNsb3QtPmRldmZuLApAQCAtMjkzLDcgKzI1Niw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZihoc19jc3IgJiBIU19DU1JfTE9PKSB7Ci0JCS8qIENsZWFyIExPTyAqLwogCQloc19jc3IgJj0gfkhTX0NTUl9MT087CiAJCWlmKHBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQoc2xvdC0+YnVzLAogCQkJCQkgICAgICBzbG90LT5kZXZmbiwKQEAgLTMxMiwyNTcgKzI3NCwyMyBAQAogICogRGV2aWNlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIGludCBjcGNpX2NvbmZpZ3VyZV9kZXYoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIGNwY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXU4IGlycV9waW47Ci0JaW50IHI7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBOT1RFOiBkZXZpY2UgYWxyZWFkeSBzZXR1cCBmcm9tIHByaW9yIHNjYW4gKi8KLQotCS8qIEZJWE1FOiBIb3cgd291bGQgd2Uga25vdyBpZiB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgZXhwYW5zaW9uIFJPTT8gKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIDB4MDBMKTsKLQotCS8qIEFzc2lnbiByZXNvdXJjZXMgKi8KLQlkYmcoImFzc2lnbmluZyByZXNvdXJjZXMgZm9yICUwMng6JTAyeC4leCIsCi0JICAgIGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7Ci0JZm9yIChyID0gMDsgciA8IDY7IHIrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyByOwotCQlpZihyZXMtPmZsYWdzKQotCQkJcGNpX2Fzc2lnbl9yZXNvdXJjZShkZXYsIHIpOwotCX0KLQlkYmcoImZpbmlzaGVkIGFzc2lnbmluZyByZXNvdXJjZXMgZm9yICUwMng6JTAyeC4leCIsCi0JICAgIGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7Ci0KLQkvKiBEb2VzIHRoaXMgZnVuY3Rpb24gaGF2ZSBhbiBpbnRlcnJ1cHQgYXQgYWxsPyAqLwotCWRiZygiY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIGludGVycnVwdCIpOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZpcnFfcGluKTsKLQlpZihpcnFfcGluKSB7Ci0JCWRiZygiZnVuY3Rpb24gdXNlcyBpbnRlcnJ1cHQgcGluICVkIiwgaXJxX3Bpbik7Ci0JfQotCi0JLyoKLQkgKiBOZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGlycSBmaWVsZCB0byAwIHNvIHRoYXQgaXQnbGwgZ2V0IGFzc2lnbmVkCi0JICogYnkgdGhlIHBjaWJpb3MgcGxhdGZvcm0gZGVwZW5kZW50IGNvZGUgY2FsbGVkIGJ5IHBjaV9lbmFibGVfZGV2aWNlLgotCSAqLwotCWRldi0+aXJxID0gMDsKLQotCWRiZygiZW5hYmxpbmcgZGV2aWNlIik7Ci0JcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsJLyogWFhYIGNoZWNrIHJldHVybiAqLwotCWRiZygibm93IGRldi0+aXJxID0gJWQiLCBkZXYtPmlycSk7Ci0JaWYoaXJxX3BpbiAmJiBkZXYtPmlycSkgewotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGRldi0+aXJxKTsKLQl9Ci0KLQkvKiBDYW4ndCB1c2UgcGNpX2luc2VydF9kZXZpY2UgYXQgdGhlIG1vbWVudCwgZG8gaXQgbWFudWFsbHkgZm9yIG5vdyAqLwotCXBjaV9wcm9jX2F0dGFjaF9kZXZpY2UoZGV2KTsKLQlkYmcoIm5vdGlmeWluZyBkcml2ZXJzIik7Ci0JLy9wY2lfYW5ub3VuY2VfZGV2aWNlX3RvX2RyaXZlcnMoZGV2KTsKLQlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3BjaV9jb25maWd1cmVfYnJpZGdlKHN0cnVjdCBwY2lfYnVzKiBidXMsIHN0cnVjdCBwY2lfZGV2KiBkZXYpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBwY2lfYnVzKiBjaGlsZDsKLQlzdHJ1Y3QgcmVzb3VyY2UqIHI7Ci0JdTggbWF4LCBuOwotCXUxNiBjb21tYW5kOwotCi0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIERvIGJhc2ljIGJyaWRnZSBpbml0aWFsaXphdGlvbiAqLwotCXJjID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NDApOwotCWlmKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgLSB3cml0ZSBvZiBQQ0lfTEFURU5DWV9USU1FUiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotCXJjID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ19MQVRFTkNZX1RJTUVSLCAweDQwKTsKLQlpZihyYykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIC0gd3JpdGUgb2YgUENJX1NFQ19MQVRFTkNZX1RJTUVSIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQl9Ci0JcmMgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCBMMV9DQUNIRV9CWVRFUyAvIDQpOwotCWlmKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgLSB3cml0ZSBvZiBQQ0lfQ0FDSEVfTElORV9TSVpFIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBwYXJlbnQgYnJpZGdlJ3Mgc3Vib3JkaW5hdGUgZmllbGQgc28gdGhhdCBjb25maWd1cmF0aW9uIHNwYWNlCi0JICogYWNjZXNzIHdpbGwgd29yayBpbiBwY2lfc2Nhbl9icmlkZ2UgYW5kIGZyaWVuZHMuCi0JICovCi0JbWF4ID0gcGNpX21heF9idXNucigpOwotCWJ1cy0+c3Vib3JkaW5hdGUgPSBtYXggKyAxOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShidXMtPnNlbGYsIFBDSV9TVUJPUkRJTkFURV9CVVMsIG1heCArIDEpOwotCi0JLyogU2NhbiBiZWhpbmQgYnJpZGdlICovCi0JbiA9IHBjaV9zY2FuX2JyaWRnZShidXMsIGRldiwgbWF4LCAyKTsKLQljaGlsZCA9IHBjaV9maW5kX2J1cygwLCBtYXggKyAxKTsKLQlpZiAoIWNoaWxkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwY2lfcHJvY19hdHRhY2hfYnVzKGNoaWxkKTsKLQotCS8qCi0JICogVXBkYXRlIHBhcmVudCBicmlkZ2UncyBzdWJvcmRpbmF0ZSBmaWVsZCBpZiB0aGVyZSB3ZXJlIG1vcmUgYnJpZGdlcwotCSAqIGJlaGluZCB0aGUgYnJpZGdlIHRoYXQgd2FzIHNjYW5uZWQuCi0JICovCi0JaWYobiA+IG1heCkgewotCQlidXMtPnN1Ym9yZGluYXRlID0gbjsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ1cy0+c2VsZiwgUENJX1NVQk9SRElOQVRFX0JVUywgbik7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIGJyaWRnZSByZXNvdXJjZXMgb2YgdGhlIGJyaWRnZSB0byBhY2NvbW1vZGF0ZSBkZXZpY2VzCi0JICogYmVoaW5kIGl0LgotCSAqLwotCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGNoaWxkKTsKLQlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoY2hpbGQpOwotCi0JLyogRW5hYmxlIHJlc291cmNlIG1hcHBpbmcgdmlhIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLQljb21tYW5kID0gUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfSU5WQUxJREFURSB8IFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlI7Ci0JciA9IGNoaWxkLT5yZXNvdXJjZVswXTsKLQlpZihyICYmIHItPnN0YXJ0KSB7Ci0JCWNvbW1hbmQgfD0gUENJX0NPTU1BTkRfSU87Ci0JfQotCXIgPSBjaGlsZC0+cmVzb3VyY2VbMV07Ci0JaWYociAmJiByLT5zdGFydCkgewotCQljb21tYW5kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JciA9IGNoaWxkLT5yZXNvdXJjZVsyXTsKLQlpZihyICYmIHItPnN0YXJ0KSB7Ci0JCWNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwotCX0KLQlyYyA9IHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKLQlpZihyYykgewotCQllcnIoIkVycm9yIHNldHRpbmcgY29tbWFuZCByZWdpc3RlciIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogU2V0IGJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCi0JY29tbWFuZCA9IFBDSV9CUklER0VfQ1RMX1BBUklUWSB8IFBDSV9CUklER0VfQ1RMX1NFUlIgfCBQQ0lfQlJJREdFX0NUTF9OT19JU0E7Ci0JcmMgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsIGNvbW1hbmQpOwotCWlmKHJjKSB7Ci0JCWVycigiRXJyb3Igc2V0dGluZyBicmlkZ2UgY29udHJvbCByZWdpc3RlciIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWRiZygiJXMgLSBleGl0IiwgX19GVU5DVElPTl9fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb25maWd1cmVfdmlzaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2Rldl93cmFwcGVkICp3cmFwcGVkX2RldiwKLQkJCQkgICBzdHJ1Y3QgcGNpX2J1c193cmFwcGVkICp3cmFwcGVkX2J1cykKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IHdyYXBwZWRfZGV2LT5kZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IHdyYXBwZWRfYnVzLT5idXM7Ci0Jc3RydWN0IHNsb3QqIHNsb3Q7Ci0KLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOwotCi0JLyoKLQkgKiBXZSBuZWVkIHRvIGZpeCB1cCB0aGUgaG90cGx1ZyByZXByZXNlbnRhdGlvbiB3aXRoIHRoZSBMaW51eAotCSAqIHJlcHJlc2VudGF0aW9uLgotCSAqLwotCWlmKHdyYXBwZWRfZGV2LT5kYXRhKSB7Ci0JCXNsb3QgPSAoc3RydWN0IHNsb3QqKSB3cmFwcGVkX2Rldi0+ZGF0YTsKLQkJc2xvdC0+ZGV2ID0gZGV2OwotCX0KLQotCS8qIElmIGl0J3MgYSBicmlkZ2UsIHNjYW4gYmVoaW5kIGl0IGZvciBkZXZpY2VzICovCisJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZihkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKLQkJcmMgPSBjcGNpX2NvbmZpZ3VyZV9icmlkZ2UoYnVzLCBkZXYpOwotCQlpZihyYykKLQkJCXJldHVybiByYzsKLQl9Ci0KLQkvKiBBY3R1YWxseSBjb25maWd1cmUgZGV2aWNlICovCi0JaWYoZGV2KSB7Ci0JCXJjID0gY3BjaV9jb25maWd1cmVfZGV2KGJ1cywgZGV2KTsKLQkJaWYocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCWRiZygiJXMgLSBleGl0IiwgX19GVU5DVElPTl9fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1bmNvbmZpZ3VyZV92aXNpdF9wY2lfZGV2X3BoYXNlMihzdHJ1Y3QgcGNpX2Rldl93cmFwcGVkICp3cmFwcGVkX2RldiwKLQkJCQkJICAgIHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgKndyYXBwZWRfYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB3cmFwcGVkX2Rldi0+ZGV2OwotCXN0cnVjdCBzbG90KiBzbG90OwotCi0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKLQlpZighZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIFJlbW92ZSB0aGUgTGludXggcmVwcmVzZW50YXRpb24gKi8KLQlpZihwY2lfcmVtb3ZlX2RldmljZV9zYWZlKGRldikpIHsKLQkJZXJyKCJDb3VsZCBub3QgcmVtb3ZlIGRldmljZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIE5vdyByZW1vdmUgdGhlIGhvdHBsdWcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JaWYod3JhcHBlZF9kZXYtPmRhdGEpIHsKLQkJc2xvdCA9IChzdHJ1Y3Qgc2xvdCopIHdyYXBwZWRfZGV2LT5kYXRhOwotCQlzbG90LT5kZXYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWRiZygiTm8gaG90cGx1ZyByZXByZXNlbnRhdGlvbiBmb3IgJTAyeDolMDJ4LiV4IiwKLQkJICAgIGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7Ci0JfQotCWRiZygiJXMgLSBleGl0IiwgX19GVU5DVElPTl9fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1bmNvbmZpZ3VyZV92aXNpdF9wY2lfYnVzX3BoYXNlMihzdHJ1Y3QgcGNpX2J1c193cmFwcGVkICp3cmFwcGVkX2J1cywKLQkJCQkJICAgIHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKndyYXBwZWRfZGV2KQotewotCXN0cnVjdCBwY2lfYnVzICpidXMgPSB3cmFwcGVkX2J1cy0+YnVzOwotCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQgPSBidXMtPnNlbGYtPmJ1czsKLQotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBUaGUgY2xlYW51cCBjb2RlIGZvciBwcm9jIGVudHJpZXMgcmVnYXJkaW5nIGJ1c2VzIHNob3VsZCBiZSBpbiB0aGUga2VybmVsLi4uICovCi0JaWYoYnVzLT5wcm9jZGlyKQotCQlkYmcoImRldGFjaF9wY2lfYnVzICVzIiwgYnVzLT5wcm9jZGlyLT5uYW1lKTsKLQlwY2lfcHJvY19kZXRhY2hfYnVzKGJ1cyk7Ci0KLQkvKiBUaGUgY2xlYW51cCBjb2RlIHNob3VsZCBsaXZlIGluIHRoZSBrZXJuZWwuLi4gKi8KLQlidXMtPnNlbGYtPnN1Ym9yZGluYXRlID0gTlVMTDsKLQotCS8qIHVubGluayBmcm9tIHBhcmVudCBidXMgKi8KLQlsaXN0X2RlbCgmYnVzLT5ub2RlKTsKLQotCS8qIE5vdywgcmVtb3ZlICovCi0JaWYoYnVzKQotCQlrZnJlZShidXMpOwotCi0JLyogVXBkYXRlIHBhcmVudCdzIHN1Ym9yZGluYXRlIGZpZWxkICovCi0JaWYocGFyZW50KSB7Ci0JCXU4IG4gPSBwY2lfYnVzX21heF9idXNucihwYXJlbnQpOwotCQlpZihuIDwgcGFyZW50LT5zdWJvcmRpbmF0ZSkgewotCQkJcGFyZW50LT5zdWJvcmRpbmF0ZSA9IG47Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBuKTsKKwkJYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCQljcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAkJfQogCX0KLQlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Zpc2l0IGNvbmZpZ3VyZV9mdW5jdGlvbnMgPSB7Ci0JLnZpc2l0X3BjaV9kZXYgPSBjb25maWd1cmVfdmlzaXRfcGNpX2RldiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX3Zpc2l0IHVuY29uZmlndXJlX2Z1bmN0aW9uc19waGFzZTIgPSB7Ci0JLnBvc3RfdmlzaXRfcGNpX2J1cyA9IHVuY29uZmlndXJlX3Zpc2l0X3BjaV9idXNfcGhhc2UyLAotCS5wb3N0X3Zpc2l0X3BjaV9kZXYgPSB1bmNvbmZpZ3VyZV92aXNpdF9wY2lfZGV2X3BoYXNlMgotfTsKLQotCiBpbnQgY3BjaV9jb25maWd1cmVfc2xvdChzdHJ1Y3Qgc2xvdCogc2xvdCkKIHsKLQlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGNoYXIgYnVzbnI7CisJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCiAJZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNTg4LDc0ICszMTYsNDQgQEAKIAkJc2xvdC0+ZGV2ID0gcGNpX2ZpbmRfc2xvdChzbG90LT5idXMtPm51bWJlciwgc2xvdC0+ZGV2Zm4pOwogCQlpZihzbG90LT5kZXYgPT0gTlVMTCkgewogCQkJZXJyKCJDb3VsZCBub3QgZmluZCBQQ0kgZGV2aWNlIGZvciBzbG90ICUwMngiLCBzbG90LT5udW1iZXIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZGJnKCJzbG90LT5kZXYgPSAlcCIsIHNsb3QtPmRldik7Ci0JaWYoc2xvdC0+ZGV2KSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JCXN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgd3JhcHBlZF9kZXY7Ci0JCXN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgd3JhcHBlZF9idXM7Ci0JCWludCBpOwotCi0JCW1lbXNldCgmd3JhcHBlZF9kZXYsIDAsIHNpemVvZiAoc3RydWN0IHBjaV9kZXZfd3JhcHBlZCkpOwotCQltZW1zZXQoJndyYXBwZWRfYnVzLCAwLCBzaXplb2YgKHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlkZXYgPSBwY2lfZmluZF9zbG90KHNsb3QtPmJ1cy0+bnVtYmVyLAotCQkJCQkgICAgUENJX0RFVkZOKFBDSV9TTE9UKHNsb3QtPmRldi0+ZGV2Zm4pLCBpKSk7Ci0JCQlpZighZGV2KQotCQkJCWNvbnRpbnVlOwotCQkJd3JhcHBlZF9kZXYuZGV2ID0gZGV2OwotCQkJd3JhcHBlZF9idXMuYnVzID0gc2xvdC0+ZGV2LT5idXM7Ci0JCQlpZihpKQotCQkJCXdyYXBwZWRfZGV2LmRhdGEgPSBOVUxMOwotCQkJZWxzZQotCQkJCXdyYXBwZWRfZGV2LmRhdGEgPSAodm9pZCopIHNsb3Q7Ci0JCQlyYyA9IHBjaV92aXNpdF9kZXYoJmNvbmZpZ3VyZV9mdW5jdGlvbnMsICZ3cmFwcGVkX2RldiwgJndyYXBwZWRfYnVzKTsKKwkJCXJldHVybiAxOwogCQl9CiAJfQogCi0JZGJnKCIlcyAtIGV4aXQsIHJjID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJjKTsKLQlyZXR1cm4gcmM7CisJaWYgKHNsb3QtPmRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShzbG90LT5kZXYsIFBDSV9TRUNPTkRBUllfQlVTLCAmYnVzbnIpOworCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhzbG90LT5kZXYtPmJ1cywgc2xvdC0+ZGV2LCBidXNucik7CisJCXBjaV9kb19zY2FuX2J1cyhjaGlsZCk7CisJCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGNoaWxkKTsKKwl9CisKKwlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoc2xvdC0+ZGV2LT5idXMpOworCisJY3BjaV9lbmFibGVfZGV2aWNlKHNsb3QtPmRldik7CisKKwlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBjcGNpX3VuY29uZmlndXJlX3Nsb3Qoc3RydWN0IHNsb3QqIHNsb3QpCiB7Ci0JaW50IHJjID0gMDsKIAlpbnQgaTsKLQlzdHJ1Y3QgcGNpX2Rldl93cmFwcGVkIHdyYXBwZWRfZGV2OwotCXN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgd3JhcHBlZF9idXM7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAogCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZighc2xvdC0+ZGV2KSB7CiAJCWVycigiTm8gZGV2aWNlIGZvciBzbG90ICUwMnhcbiIsIHNsb3QtPm51bWJlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW1lbXNldCgmd3JhcHBlZF9kZXYsIDAsIHNpemVvZiAoc3RydWN0IHBjaV9kZXZfd3JhcHBlZCkpOwotCW1lbXNldCgmd3JhcHBlZF9idXMsIDAsIHNpemVvZiAoc3RydWN0IHBjaV9idXNfd3JhcHBlZCkpOwotCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlkZXYgPSBwY2lfZmluZF9zbG90KHNsb3QtPmJ1cy0+bnVtYmVyLAogCQkJCSAgICBQQ0lfREVWRk4oUENJX1NMT1Qoc2xvdC0+ZGV2Zm4pLCBpKSk7CiAJCWlmKGRldikgewotCQkJd3JhcHBlZF9kZXYuZGV2ID0gZGV2OwotCQkJd3JhcHBlZF9idXMuYnVzID0gZGV2LT5idXM7Ci0gCQkJaWYoaSkKLSAJCQkJd3JhcHBlZF9kZXYuZGF0YSA9IE5VTEw7Ci0gCQkJZWxzZQotIAkJCQl3cmFwcGVkX2Rldi5kYXRhID0gKHZvaWQqKSBzbG90OwotCQkJZGJnKCIlcyAtIHVuY29uZmlndXJlIHBoYXNlIDIiLCBfX0ZVTkNUSU9OX18pOwotCQkJcmMgPSBwY2lfdmlzaXRfZGV2KCZ1bmNvbmZpZ3VyZV9mdW5jdGlvbnNfcGhhc2UyLAotCQkJCQkgICAmd3JhcHBlZF9kZXYsCi0JCQkJCSAgICZ3cmFwcGVkX2J1cyk7Ci0JCQlpZihyYykKLQkJCQlicmVhazsKKwkJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQkJc2xvdC0+ZGV2ID0gTlVMTDsKIAkJfQogCX0KLQlkYmcoIiVzIC0gZXhpdCwgcmMgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOwotCXJldHVybiByYzsKKwlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCBmMzEzMTIxLi40NmIyOTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTEzMCw2ICsxMzAsNyBAQAogCXU4IHNsb3RfYnVzOwkJLyogQnVzIHdoZXJlIHRoZSBzbG90cyBoYW5kbGVkIGJ5IHRoaXMgY29udHJvbGxlciBzaXQgKi8KIAl1OCBjdHJsY2FwOwogCXUxNiB2ZW5kb3JfaWQ7CisJdTggY2FwX2Jhc2U7CiB9OwogCiBzdHJ1Y3QgaXJxX21hcHBpbmcgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IGVkMWZkOGQuLmRmNDkxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogc3RhdGljIHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9pZCBwb3J0X3BjaV9pZHNbXSA9IHsgeyAKIAkudmVuZG9yID0gUENJX0FOWV9JRCwgCiAJLmRldmljZSA9IFBDSV9BTllfSUQsCi0JLnBvcnRfdHlwZSA9IFBDSUVfUkNfUE9SVCwgCisJLnBvcnRfdHlwZSA9IFBDSUVfQU5ZX1BPUlQsCiAJLnNlcnZpY2VfdHlwZSA9IFBDSUVfUE9SVF9TRVJWSUNFX0hQLAogCS5kcml2ZXJfZGF0YSA9CTAsIAogCX0sIHsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKaW5kZXggOWU3MGM0Ni4uMWNkYTMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKQEAgLTEwOSwyMCArMTA5LDIwIEBACiB9Owogc3RhdGljIGludCBwY2llX2NhcF9iYXNlID0gMDsJCS8qIEJhc2Ugb2YgdGhlIFBDSSBFeHByZXNzIGNhcGFiaWxpdHkgaXRlbSBzdHJ1Y3R1cmUgKi8gCiAKLSNkZWZpbmUgUENJRV9DQVBfSUQJKCBwY2llX2NhcF9iYXNlICsgUENJRUNBUElEICkKLSNkZWZpbmUgTlhUX0NBUF9QVFIJKCBwY2llX2NhcF9iYXNlICsgTlhUQ0FQUFRSICkKLSNkZWZpbmUgQ0FQX1JFRwkJKCBwY2llX2NhcF9iYXNlICsgQ0FQUkVHICkKLSNkZWZpbmUgREVWX0NBUAkJKCBwY2llX2NhcF9iYXNlICsgREVWQ0FQICkKLSNkZWZpbmUgREVWX0NUUkwJKCBwY2llX2NhcF9iYXNlICsgREVWQ1RSTCApCi0jZGVmaW5lIERFVl9TVEFUVVMJKCBwY2llX2NhcF9iYXNlICsgREVWU1RBVFVTICkKLSNkZWZpbmUgTE5LX0NBUAkJKCBwY2llX2NhcF9iYXNlICsgTE5LQ0FQICkKLSNkZWZpbmUgTE5LX0NUUkwJKCBwY2llX2NhcF9iYXNlICsgTE5LQ1RSTCApCi0jZGVmaW5lIExOS19TVEFUVVMJKCBwY2llX2NhcF9iYXNlICsgTE5LU1RBVFVTICkKLSNkZWZpbmUgU0xPVF9DQVAJKCBwY2llX2NhcF9iYXNlICsgU0xPVENBUCApCi0jZGVmaW5lIFNMT1RfQ1RSTAkoIHBjaWVfY2FwX2Jhc2UgKyBTTE9UQ1RSTCApCi0jZGVmaW5lIFNMT1RfU1RBVFVTCSggcGNpZV9jYXBfYmFzZSArIFNMT1RTVEFUVVMgKQotI2RlZmluZSBST09UX0NUUkwJKCBwY2llX2NhcF9iYXNlICsgUk9PVENUUkwgKQotI2RlZmluZSBST09UX1NUQVRVUwkoIHBjaWVfY2FwX2Jhc2UgKyBST09UU1RBVFVTICkKKyNkZWZpbmUgUENJRV9DQVBfSUQoY2IpCSggY2IgKyBQQ0lFQ0FQSUQgKQorI2RlZmluZSBOWFRfQ0FQX1BUUihjYikJKCBjYiArIE5YVENBUFBUUiApCisjZGVmaW5lIENBUF9SRUcoY2IpCSggY2IgKyBDQVBSRUcgKQorI2RlZmluZSBERVZfQ0FQKGNiKQkoIGNiICsgREVWQ0FQICkKKyNkZWZpbmUgREVWX0NUUkwoY2IpCSggY2IgKyBERVZDVFJMICkKKyNkZWZpbmUgREVWX1NUQVRVUyhjYikJKCBjYiArIERFVlNUQVRVUyApCisjZGVmaW5lIExOS19DQVAoY2IpCSggY2IgKyBMTktDQVAgKQorI2RlZmluZSBMTktfQ1RSTChjYikJKCBjYiArIExOS0NUUkwgKQorI2RlZmluZSBMTktfU1RBVFVTKGNiKQkoIGNiICsgTE5LU1RBVFVTICkKKyNkZWZpbmUgU0xPVF9DQVAoY2IpCSggY2IgKyBTTE9UQ0FQICkKKyNkZWZpbmUgU0xPVF9DVFJMKGNiKQkoIGNiICsgU0xPVENUUkwgKQorI2RlZmluZSBTTE9UX1NUQVRVUyhjYikJKCBjYiArIFNMT1RTVEFUVVMgKQorI2RlZmluZSBST09UX0NUUkwoY2IpCSggY2IgKyBST09UQ1RSTCApCisjZGVmaW5lIFJPT1RfU1RBVFVTKGNiKQkoIGNiICsgUk9PVFNUQVRVUyApCiAKICNkZWZpbmUgaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBkZXYsIHJlZyAsIHZhbHVlKQkJXAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHJlZywgJnZhbHVlKQpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybiByZXR2YWw7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAl9CiAKIAlkYmcoIiVzOiBCZWZvcmUgaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX0NUUkwgJXhcbiIsIF9fRlVOQ1RJT05fXywgY21kKTsKLQlyZXR2YWwgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwsIGNtZCB8IENNRF9DTVBMX0lOVFJfRU5BQkxFKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBjbWQgfCBDTURfQ01QTF9JTlRSX0VOQUJMRSk7CiAJaWYgKHJldHZhbCkgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX0NUUkwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMzQyLDcgKzM0Miw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJCi0JcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBMTktfU1RBVFVTLCBsbmtfc3RhdHVzKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCBsbmtfc3RhdHVzKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBMTktfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTM3NiwxNCArMzc2LDE0IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTCwgc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3RfY3RybCk7CiAKIAlpZiAocmV0dmFsKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlkYmcoIiVzOiBTTE9UX0NUUkwgJXgsIHZhbHVlIHJlYWQgJXhcbiIsIF9fRlVOQ1RJT05fXyxTTE9UX0NUUkwsIHNsb3RfY3RybCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4LCB2YWx1ZSByZWFkICV4XG4iLCBfX0ZVTkNUSU9OX18sU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jdHJsKTsKIAogCWF0dGVuX2xlZF9zdGF0ZSA9IChzbG90X2N0cmwgJiBBVFROX0xFRF9DVFJMKSA+PiA2OwogCkBAIC00MjMsMTMgKzQyMywxMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwsIHNsb3RfY3RybCk7CisJcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2N0cmwpOwogCiAJaWYgKHJldHZhbCkgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB2YWx1ZSByZWFkICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTCwgc2xvdF9jdHJsKTsKKwlkYmcoIiVzOiBTTE9UX0NUUkwgJXggdmFsdWUgcmVhZCAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2N0cmwpOwogCiAJcHdyX3N0YXRlID0gKHNsb3RfY3RybCAmIFBXUl9DVFJMKSA+PiAxMDsKIApAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3Rfc3RhdHVzKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC00OTAsNyArNDkwLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMsIHNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9zdGF0dXMpOwogCiAJaWYgKHJldHZhbCkgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTUxOCw3ICs1MTgsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X3N0YXR1cyk7CiAKIAlpZiAocmV0dmFsKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9TVEFUVVMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCWVycigiJXM6IEludmFsaWQgSFBDIHNsb3QgbnVtYmVyIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCBzbG90X2N0cmwpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2N0cmwpOwogCiAJaWYgKHJjKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTU3NCw3ICs1NzQsNyBAQAogCQlzbG90X2NtZCA9IHNsb3RfY21kIHwgSFBfSU5UUl9FTkFCTEU7IAogCiAJcGNpZV93cml0ZV9jbWQoc2xvdCwgc2xvdF9jbWQpOwotCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMLCBzbG90X2NtZCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2NtZCk7CiAJCiAJcmV0dXJuIHJjOwogfQpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCXJldHVybiA7CiAJfQogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTCwgc2xvdF9jdHJsKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jdHJsKTsKIAogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC02MTEsNyArNjExLDcgQEAKIAogCXBjaWVfd3JpdGVfY21kKHNsb3QsIHNsb3RfY21kKTsKIAotCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsX19GVU5DVElPTl9fLCBTTE9UX0NUUkwsIHNsb3RfY21kKTsKKwlkYmcoIiVzOiBTTE9UX0NUUkwgJXggd3JpdGUgY21kICV4XG4iLF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jbWQpOwogCXJldHVybjsKIH0KIApAQCAtNjMzLDcgKzYzMyw3IEBACiAJCXJldHVybiA7CiAJfQogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTCwgc2xvdF9jdHJsKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jdHJsKTsKIAogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAlpZiAoIXBjaWVocF9wb2xsX21vZGUpCiAJCXNsb3RfY21kID0gc2xvdF9jbWQgfCBIUF9JTlRSX0VOQUJMRTsgCiAJcGNpZV93cml0ZV9jbWQoc2xvdCwgc2xvdF9jbWQpOwotCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMLCBzbG90X2NtZCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2NtZCk7CiAKIAlyZXR1cm47CiB9CkBAIC02NjksNyArNjY5LDcgQEAKIAkJcmV0dXJuIDsKIAl9CiAKLQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCBzbG90X2N0cmwpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBzbG90X2N0cmwpOwogCiAJaWYgKHJjKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQlzbG90X2NtZCA9IHNsb3RfY21kIHwgSFBfSU5UUl9FTkFCTEU7IAogCXBjaWVfd3JpdGVfY21kKHNsb3QsIHNsb3RfY21kKTsKIAotCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsX19GVU5DVElPTl9fLCBTTE9UX0NUUkwsIHNsb3RfY21kKTsKKwlkYmcoIiVzOiBTTE9UX0NUUkwgJXggd3JpdGUgY21kICV4XG4iLF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jbWQpOwogCXJldHVybjsKIH0KIApAQCAtNzA3LDcgKzcwNyw3IEBACiAJKmZpcnN0X2RldmljZV9udW0gPSAwOwogCSpudW1fY3Rscl9zbG90cyA9IDE7IAogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX2R3b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NBUCwgc2xvdF9jYXApOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF9kd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DQVAoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X2NhcCk7CiAKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQgU0xPVF9DQVAgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNzkzLDEzICs3OTMsMTMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCBzbG90X2N0cmwpOworCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jdHJsKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBTTE9UX0NUUkwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NUUkwgJXgsIHZhbHVlIHJlYWQgJXhuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwsIAorCWRiZygiJXM6IFNMT1RfQ1RSTCAleCwgdmFsdWUgcmVhZCAleG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksCiAJCXNsb3RfY3RybCk7CiAKIAlzbG90X2NtZCA9IChzbG90X2N0cmwgJiB+UFdSX0NUUkwpIHwgUE9XRVJfT047CkBAIC04MTMsNyArODEzLDcgQEAKIAkJZXJyKCIlczogV3JpdGUgJXggY29tbWFuZCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3RfY21kKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NUUkwgJXggd3JpdGUgY21kICV4XG4iLF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMLCBzbG90X2NtZCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4IHdyaXRlIGNtZCAleFxuIixfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3RfY21kKTsKIAogCURCR19MRUFWRV9ST1VUSU5FCiAKQEAgLTg0MiwxMyArODQyLDEzIEBACiAJCWVycigiJXM6IEludmFsaWQgSFBDIHNsb3QgbnVtYmVyIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTCwgc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3RfY3RybCk7CiAKIAlpZiAocmV0dmFsKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JZGJnKCIlczogU0xPVF9DVFJMICV4LCB2YWx1ZSByZWFkICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTCwgCisJZGJnKCIlczogU0xPVF9DVFJMICV4LCB2YWx1ZSByZWFkICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksCiAJCXNsb3RfY3RybCk7CiAKIAlzbG90X2NtZCA9IChzbG90X2N0cmwgJiB+UFdSX0NUUkwpIHwgUE9XRVJfT0ZGOwpAQCAtODYyLDcgKzg2Miw3IEBACiAJCWVycigiJXM6IFdyaXRlIGNvbW1hbmQgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NUUkwgJXggd3JpdGUgY21kICV4XG4iLF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMLCBzbG90X2NtZCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4IHdyaXRlIGNtZCAleFxuIixfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTChzbG90LT5jdHJsLT5jYXBfYmFzZSksIHNsb3RfY21kKTsKIAogCURCR19MRUFWRV9ST1VUSU5FCiAKQEAgLTkwMCw3ICs5MDAsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgc2xvdF9zdGF0dXMpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtOTE4LDcgKzkxOCw3IEBACiAJZGJnKCIlczogaW50cl9sb2MgJXhcbiIsIF9fRlVOQ1RJT05fXywgaW50cl9sb2MpOwogCS8qIE1hc2sgSG90LXBsdWcgSW50ZXJydXB0IEVuYWJsZSAqLwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCB0ZW1wX3dvcmQpOworCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAkJaWYgKHJjKSB7CiAJCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CkBAIC05MjgsMTQgKzkyOCwxNCBAQAogCQlkYmcoIiVzOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIHdpdGggdmFsdWUgJXhcbiIsIF9fRlVOQ1RJT05fXywgdGVtcF93b3JkKTsKIAkJdGVtcF93b3JkID0gKHRlbXBfd29yZCAmIH5IUF9JTlRSX0VOQUJMRSAmIH5DTURfQ01QTF9JTlRSX0VOQUJMRSkgfCAweDAwOwogCi0JCXJjID0gaHBfcmVnaXN0ZXJfd3JpdGVfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCB0ZW1wX3dvcmQpOworCQlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTChjdHJsLT5jYXBfYmFzZSksIHRlbXBfd29yZCk7CiAJCWlmIChyYykgewogCQkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybiBJUlFfTk9ORTsKIAkJfQogCQlkYmcoIiVzOiBocF9yZWdpc3Rlcl93cml0ZV93b3JkIFNMT1RfQ1RSTCB3aXRoIHZhbHVlICV4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXBfd29yZCk7CiAJCQotCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMsIHNsb3Rfc3RhdHVzKTsKKwkJcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgc2xvdF9zdGF0dXMpOwogCQlpZiAocmMpIHsKIAkJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9TVEFUVVMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuIElSUV9OT05FOwpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJCQogCQkvKiBDbGVhciBjb21tYW5kIGNvbXBsZXRlIGludGVycnVwdCBjYXVzZWQgYnkgdGhpcyB3cml0ZSAqLwogCQl0ZW1wX3dvcmQgPSAweDFmOwotCQlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCB0ZW1wX3dvcmQpOworCQlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAkJaWYgKHJjKSB7CiAJCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CkBAIC05NzUsMTQgKzk3NSwxNCBAQAogCiAJLyogQ2xlYXIgYWxsIGV2ZW50cyBhZnRlciBzZXJ2aW5nIHRoZW0gKi8KIAl0ZW1wX3dvcmQgPSAweDFGOwotCXJjID0gaHBfcmVnaXN0ZXJfd3JpdGVfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMsIHRlbXBfd29yZCk7CisJcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhjdHJsLT5jYXBfYmFzZSksIHRlbXBfd29yZCk7CiAJaWYgKHJjKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl93cml0ZV93b3JkIFNMT1RfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAkvKiBVbm1hc2sgSG90LXBsdWcgSW50ZXJydXB0IEVuYWJsZSAqLwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCB0ZW1wX3dvcmQpOworCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAkJaWYgKHJjKSB7CiAJCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CkBAIC05OTIsMTQgKzk5MiwxNCBAQAogCQlkYmcoIiVzOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIHdpdGggdmFsdWUgJXhcbiIsIF9fRlVOQ1RJT05fXywgdGVtcF93b3JkKTsKIAkJdGVtcF93b3JkID0gKHRlbXBfd29yZCAmIH5IUF9JTlRSX0VOQUJMRSkgfCBIUF9JTlRSX0VOQUJMRTsKIAotCQlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfQ1RSTCwgdGVtcF93b3JkKTsKKwkJcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoY3RybC0+Y2FwX2Jhc2UpLCB0ZW1wX3dvcmQpOwogCQlpZiAocmMpIHsKIAkJCWVycigiJXMgOiBocF9yZWdpc3Rlcl93cml0ZV93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CiAJCX0KIAkJZGJnKCIlczogaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX0NUUkwgd2l0aCB2YWx1ZSAleFxuIiwgX19GVU5DVElPTl9fLCB0ZW1wX3dvcmQpOyAJCiAJCi0JCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgc2xvdF9zdGF0dXMpOworCQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X3N0YXR1cyk7CiAJCWlmIChyYykgewogCQkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCQkKIAkJLyogQ2xlYXIgY29tbWFuZCBjb21wbGV0ZSBpbnRlcnJ1cHQgY2F1c2VkIGJ5IHRoaXMgd3JpdGUgKi8KIAkJdGVtcF93b3JkID0gMHgxRjsKLQkJcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgdGVtcF93b3JkKTsKKwkJcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhjdHJsLT5jYXBfYmFzZSksIHRlbXBfd29yZCk7CiAJCWlmIChyYykgewogCQkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQgU0xPVF9TVEFUVVMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuIElSUV9OT05FOwpAQCAtMTAzOCw3ICsxMDM4LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19DQVAsIGxua19jYXApOworCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19DQVAoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBsbmtfY2FwKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQgIExOS19DQVAgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19DQVAsIGxua19jYXApOworCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19DQVAoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBsbmtfY2FwKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfZHdvcmQgIExOS19DQVAgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldHZhbCA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgTE5LX1NUQVRVUywgbG5rX3N0YXR1cyk7CisJcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBMTktfU1RBVFVTKHNsb3QtPmN0cmwtPmNhcF9iYXNlKSwgbG5rX3N0YXR1cyk7CiAKIAlpZiAocmV0dmFsKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgTE5LX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMTgyLDcgKzExODIsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dmFsID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBMTktfU1RBVFVTLCBsbmtfc3RhdHVzKTsKKwlyZXR2YWwgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIExOS19TVEFUVVMoc2xvdC0+Y3RybC0+Y2FwX2Jhc2UpLCBsbmtfc3RhdHVzKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBMTktfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTEyOTIsNDcgKzEyOTIsNDggQEAKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCi0JcGNpZV9jYXBfYmFzZSA9IGNhcF9iYXNlOworCWN0cmwtPmNhcF9iYXNlID0gY2FwX2Jhc2U7CiAKIAlkYmcoIiVzOiBwY2llX2NhcF9iYXNlICV4XG4iLCBfX0ZVTkNUSU9OX18sIHBjaWVfY2FwX2Jhc2UpOwogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGRldiwgQ0FQX1JFRywgY2FwX3JlZyk7CisJcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGRldiwgQ0FQX1JFRyhjdHJsLT5jYXBfYmFzZSksIGNhcF9yZWcpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIENBUF9SRUcgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAl9Ci0JZGJnKCIlczogQ0FQX1JFRyBvZmZzZXQgJXggY2FwX3JlZyAleFxuIiwgX19GVU5DVElPTl9fLCBDQVBfUkVHLCBjYXBfcmVnKTsKKwlkYmcoIiVzOiBDQVBfUkVHIG9mZnNldCAleCBjYXBfcmVnICV4XG4iLCBfX0ZVTkNUSU9OX18sIENBUF9SRUcoY3RybC0+Y2FwX2Jhc2UpLCBjYXBfcmVnKTsKIAotCWlmICgoKGNhcF9yZWcgJiBTTE9UX0lNUEwpID09IDApIHx8ICgoY2FwX3JlZyAmIERFVl9QT1JUX1RZUEUpICE9IDB4MDA0MCkpeworCWlmICgoKGNhcF9yZWcgJiBTTE9UX0lNUEwpID09IDApIHx8ICgoKGNhcF9yZWcgJiBERVZfUE9SVF9UWVBFKSAhPSAweDAwNDApCisJCSYmICgoY2FwX3JlZyAmIERFVl9QT1JUX1RZUEUpICE9IDB4MDA2MCkpKSB7CiAJCWRiZygiJXMgOiBUaGlzIGlzIG5vdCBhIHJvb3QgcG9ydCBvciB0aGUgcG9ydCBpcyBub3QgY29ubmVjdGVkIHRvIGEgc2xvdFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX2R3b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NBUCwgc2xvdF9jYXApOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF9kd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DQVAoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X2NhcCk7CiAJaWYgKHJjKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgQ0FQX1JFRyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NBUCBvZmZzZXQgJXggc2xvdF9jYXAgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DQVAsIHNsb3RfY2FwKTsKKwlkYmcoIiVzOiBTTE9UX0NBUCBvZmZzZXQgJXggc2xvdF9jYXAgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DQVAoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X2NhcCk7CiAKIAlpZiAoIShzbG90X2NhcCAmIEhQX0NBUCkpIHsKIAkJZGJnKCIlcyA6IFRoaXMgc2xvdCBpcyBub3QgaG90LXBsdWcgY2FwYWJsZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCS8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZSAqLwotCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgc2xvdF9zdGF0dXMpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhjdHJsLT5jYXBfYmFzZSksIHNsb3Rfc3RhdHVzKTsKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBTTE9UX1NUQVRVUyBvZmZzZXQgJXggc2xvdF9zdGF0dXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9TVEFUVVMsIHNsb3Rfc3RhdHVzKTsKKwlkYmcoIiVzOiBTTE9UX1NUQVRVUyBvZmZzZXQgJXggc2xvdF9zdGF0dXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X3N0YXR1cyk7CiAKLQlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9DVFJMLCBzbG90X2N0cmwpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX0NUUkwoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X2N0cmwpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NUUkwgb2Zmc2V0ICV4IHNsb3RfY3RybCAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwsIHNsb3RfY3RybCk7CisJZGJnKCIlczogU0xPVF9DVFJMIG9mZnNldCAleCBzbG90X2N0cmwgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgc2xvdF9jdHJsKTsKIAogCWlmIChmaXJzdCkgewogCQlzcGluX2xvY2tfaW5pdCgmaHBjX2V2ZW50X2xvY2spOwpAQCAtMTM3MiwzNiArMTM3MywzNyBAQAogCXBocF9jdGxyLT5udW1fc2xvdHMgPSAxOwogCiAJLyogTWFzayBIb3QtcGx1ZyBJbnRlcnJ1cHQgRW5hYmxlICovCi0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGRldiwgU0xPVF9DVFJMLCB0ZW1wX3dvcmQpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBkZXYsIFNMT1RfQ1RSTChjdHJsLT5jYXBfYmFzZSksIHRlbXBfd29yZCk7CiAJaWYgKHJjKSB7CiAJCWVycigiJXMgOiBocF9yZWdpc3Rlcl9yZWFkX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCi0JZGJnKCIlczogU0xPVF9DVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMLCB0ZW1wX3dvcmQpOworCWRiZygiJXM6IFNMT1RfQ1RSTCAleCB2YWx1ZSByZWFkICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfQ1RSTChjdHJsLT5jYXBfYmFzZSksIHRlbXBfd29yZCk7CiAJdGVtcF93b3JkID0gKHRlbXBfd29yZCAmIH5IUF9JTlRSX0VOQUJMRSAmIH5DTURfQ01QTF9JTlRSX0VOQUJMRSkgfCAweDAwOwogCi0JcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBkZXYsIFNMT1RfQ1RSTCwgdGVtcF93b3JkKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGRldiwgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCWRiZygiJXMgOiBNYXNrIEhQSUUgaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX0NUUkwgJXhcbiIsIF9fRlVOQ1RJT05fXywgdGVtcF93b3JkKTsKIAotCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgc2xvdF9zdGF0dXMpOworCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUyhjdHJsLT5jYXBfYmFzZSksIHNsb3Rfc3RhdHVzKTsKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3JlYWRfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBNYXNrIEhQSUUgU0xPVF9TVEFUVVMgb2Zmc2V0ICV4IHJlYWRzIHNsb3Rfc3RhdHVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJZGJnKCIlczogTWFzayBIUElFIFNMT1RfU1RBVFVTIG9mZnNldCAleCByZWFkcyBzbG90X3N0YXR1cyAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX1NUQVRVUyhjdHJsLT5jYXBfYmFzZSkKKwkJLCBzbG90X3N0YXR1cyk7CiAKIAl0ZW1wX3dvcmQgPSAweDFGOyAvKiBDbGVhciBhbGwgZXZlbnRzICovCi0JcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBocF9jdGxyLT5wY2lfZGV2LCBTTE9UX1NUQVRVUywgdGVtcF93b3JkKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQgU0xPVF9TVEFUVVMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAl9Ci0JZGJnKCIlczogU0xPVF9TVEFUVVMgb2Zmc2V0ICV4IHdyaXRlcyBzbG90X3N0YXR1cyAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX1NUQVRVUywgdGVtcF93b3JkKTsKKwlkYmcoIiVzOiBTTE9UX1NUQVRVUyBvZmZzZXQgJXggd3JpdGVzIHNsb3Rfc3RhdHVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAogCWlmIChwY2llaHBfcG9sbF9tb2RlKSAgey8qIEluc3RhbGwgaW50ZXJydXB0IHBvbGxpbmcgY29kZSAqLwogCQkvKiBJbnN0YWxsIGFuZCBzdGFydCB0aGUgaW50ZXJydXB0IHBvbGxpbmcgdGltZXIgKi8KQEAgLTE0MTcsMTIgKzE0MTksMTIgQEAKIAkJfQogCX0KIAotCXJjID0gaHBfcmVnaXN0ZXJfcmVhZF93b3JkKHBkZXYsIFNMT1RfQ1RSTCwgdGVtcF93b3JkKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3JlYWRfd29yZChwZGV2LCBTTE9UX0NUUkwoY3RybC0+Y2FwX2Jhc2UpLCB0ZW1wX3dvcmQpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfQ1RSTCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBTTE9UX0NUUkwgJXggdmFsdWUgcmVhZCAleFxuIiwgX19GVU5DVElPTl9fLCBTTE9UX0NUUkwsIHRlbXBfd29yZCk7CisJZGJnKCIlczogU0xPVF9DVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAlkYmcoIiVzOiBzbG90X2NhcCAleFxuIiwgX19GVU5DVElPTl9fLCBzbG90X2NhcCk7CiAKIAlpbnRyX2VuYWJsZSA9IGludHJfZW5hYmxlIHwgUFJTTl9ERVRFQ1RfRU5BQkxFOwpAQCAtMTQ0NiwyNyArMTQ0OCwyNyBAQAogCWRiZygiJXM6IHRlbXBfd29yZCAleFxuIiwgX19GVU5DVElPTl9fLCB0ZW1wX3dvcmQpOwogCiAJLyogVW5tYXNrIEhvdC1wbHVnIEludGVycnVwdCBFbmFibGUgZm9yIHRoZSBpbnRlcnJ1cHQgbm90aWZpY2F0aW9uIG1lY2hhbmlzbSBjYXNlICovCi0JcmMgPSBocF9yZWdpc3Rlcl93cml0ZV93b3JkKHBkZXYsIFNMT1RfQ1RSTCwgdGVtcF93b3JkKTsKKwlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGRldiwgU0xPVF9DVFJMKGN0cmwtPmNhcF9iYXNlKSwgdGVtcF93b3JkKTsKIAlpZiAocmMpIHsKIAkJZXJyKCIlcyA6IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQgU0xPVF9DVFJMIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCWRiZygiJXMgOiBVbm1hc2sgSFBJRSBocF9yZWdpc3Rlcl93cml0ZV93b3JkIFNMT1RfQ1RSTCB3aXRoICV4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXBfd29yZCk7Ci0JcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJcmMgPSBocF9yZWdpc3Rlcl9yZWFkX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTKGN0cmwtPmNhcF9iYXNlKSwgc2xvdF9zdGF0dXMpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfcmVhZF93b3JkIFNMT1RfU1RBVFVTIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCWRiZygiJXM6IFVubWFzayBIUElFIFNMT1RfU1RBVFVTIG9mZnNldCAleCByZWFkcyBzbG90X3N0YXR1cyAleFxuIiwgX19GVU5DVElPTl9fLCAKLQkJU0xPVF9TVEFUVVMsIHNsb3Rfc3RhdHVzKTsKKwkJU0xPVF9TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCBzbG90X3N0YXR1cyk7CiAJCiAJdGVtcF93b3JkID0gIDB4MUY7IC8qIENsZWFyIGFsbCBldmVudHMgKi8KLQlyYyA9IGhwX3JlZ2lzdGVyX3dyaXRlX3dvcmQocGhwX2N0bHItPnBjaV9kZXYsIFNMT1RfU1RBVFVTLCB0ZW1wX3dvcmQpOworCXJjID0gaHBfcmVnaXN0ZXJfd3JpdGVfd29yZChwaHBfY3Rsci0+cGNpX2RldiwgU0xPVF9TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCB0ZW1wX3dvcmQpOwogCWlmIChyYykgewogCQllcnIoIiVzIDogaHBfcmVnaXN0ZXJfd3JpdGVfd29yZCBTTE9UX1NUQVRVUyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KLQlkYmcoIiVzOiBTTE9UX1NUQVRVUyBvZmZzZXQgJXggd3JpdGVzIHNsb3Rfc3RhdHVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNMT1RfU1RBVFVTLCB0ZW1wX3dvcmQpOworCWRiZygiJXM6IFNMT1RfU1RBVFVTIG9mZnNldCAleCB3cml0ZXMgc2xvdF9zdGF0dXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0xPVF9TVEFUVVMoY3RybC0+Y2FwX2Jhc2UpLCB0ZW1wX3dvcmQpOwogCQogCS8qICBBZGQgdGhpcyBIUEMgaW5zdGFuY2UgaW50byB0aGUgSFBDIGxpc3QgKi8KIAlzcGluX2xvY2soJmxpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMKaW5kZXggZjBjNTNmOC4uYTcwYTVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwpAQCAtOTUsNyArOTUsNyBAQAogICovCiBzdGF0aWMgdm9pZCByZWxlYXNlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90KQogewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBzbG90ICpzbG90ID0gaG90cGx1Z19zbG90LT5wcml2YXRlOwogCiAJZGJnKCIlcyAtIHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBob3RwbHVnX3Nsb3QtPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMKaW5kZXggOWY5MGViOC4uNDkwYTk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2N0cmwuYwpAQCAtMTg4NSw3ICsxODg1LDcgQEAKIAlmdW5jID0gc2hwY2hwX3Nsb3RfZmluZChwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UsIDApOwogCWlmICghZnVuYykgewogCQlkYmcoIiVzOiBFcnJvciEgc2xvdCBOVUxMXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIChsYXRjaCBjbG9zZWQsIGNhcmQgcHJlc2VudCwgcG93ZXIgb2ZmKSAqLwpAQCAtMTg5NCwxOSArMTg5NCwxOSBAQAogCWlmIChyYyB8fCAhZ2V0c3RhdHVzKSB7CiAJCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJdXAoJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAlyYyA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCWlmIChyYyB8fCBnZXRzdGF0dXMpIHsKIAkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOwogCQl1cCgmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXJjID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfcG93ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJaWYgKHJjIHx8IGdldHN0YXR1cykgewogCQlpbmZvKCIlczogYWxyZWFkeSBlbmFibGVkIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJdXAoJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAl1cCgmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCkBAIC0xOTE0LDcgKzE5MTQsNyBAQAogCiAJZnVuYyA9IHNocGNocF9zbG90X2NyZWF0ZShwX3Nsb3QtPmJ1cyk7CiAJaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRU5PTUVNOwogCiAJZnVuYy0+YnVzID0gcF9zbG90LT5idXM7CiAJZnVuYy0+ZGV2aWNlID0gcF9zbG90LT5kZXZpY2U7CkBAIC0xOTM5LDcgKzE5MzksNyBAQAogCQkvKiBTZXR1cCBzbG90IHN0cnVjdHVyZSB3aXRoIGVudHJ5IGZvciBlbXB0eSBzbG90ICovCiAJCWZ1bmMgPSBzaHBjaHBfc2xvdF9jcmVhdGUocF9zbG90LT5idXMpOwogCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJcmV0dXJuICgxKTsJLyogT3V0IG9mIG1lbW9yeSAqLworCQkJcmV0dXJuIC1FTk9NRU07CS8qIE91dCBvZiBtZW1vcnkgKi8KIAogCQlmdW5jLT5idXMgPSBwX3Nsb3QtPmJ1czsKIAkJZnVuYy0+ZGV2aWNlID0gcF9zbG90LT5kZXZpY2U7CkBAIC0xOTcyLDcgKzE5NzIsNyBAQAogCXN0cnVjdCBwY2lfZnVuYyAqZnVuYzsKIAogCWlmICghcF9zbG90LT5jdHJsKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwY2lfYnVzID0gcF9zbG90LT5jdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZTsKIApAQCAtMTk4MywxOSArMTk4MywxOSBAQAogCWlmIChyZXQgfHwgIWdldHN0YXR1cykgewogCQlpbmZvKCIlczogbm8gYWRhcHRlciBvbiBzbG90KCV4KVxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPm51bWJlcik7CiAJCXVwKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcmV0ID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJaWYgKHJldCB8fCBnZXRzdGF0dXMpIHsKIAkJaW5mbygiJXM6IGxhdGNoIG9wZW4gb24gc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOwogCQl1cCgmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXJldCA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCWlmIChyZXQgfHwgIWdldHN0YXR1cykgewogCQlpbmZvKCIlczogYWxyZWFkeSBkaXNhYmxlZCBzbG90KCV4KVxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPm51bWJlcik7CiAJCXVwKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJdXAoJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIApAQCAtMjAxMSw3ICsyMDExLDcgQEAKIAkJLyogQ2hlY2sgdGhlIENsYXNzIENvZGUgKi8KIAkJcmMgPSBwY2lfYnVzX3JlYWRfY29uZmlnX2J5dGUgKHBjaV9idXMsIGRldmZuLCAweDBCLCAmY2xhc3NfY29kZSk7CiAJCWlmIChyYykKLQkJCXJldHVybiByYzsKKwkJCXJldHVybiAtRU5PREVWOwogCiAJCWlmIChjbGFzc19jb2RlID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpIHsKIAkJCS8qIERpc3BsYXkvVmlkZW8gYWRhcHRlciAobm90IHN1cHBvcnRlZCkgKi8KQEAgLTIwMjAsMTMgKzIwMjAsMTMgQEAKIAkJCS8qIFNlZSBpZiBpdCdzIGEgYnJpZGdlICovCiAJCQlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfYnl0ZSAocGNpX2J1cywgZGV2Zm4sIFBDSV9IRUFERVJfVFlQRSwgJmhlYWRlcl90eXBlKTsKIAkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7CisJCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJCS8qIElmIGl0J3MgYSBicmlkZ2UsIGNoZWNrIHRoZSBWR0EgRW5hYmxlIGJpdCAqLwogCQkJaWYgKChoZWFkZXJfdHlwZSAmIDB4N0YpID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKIAkJCQlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfYnl0ZSAocGNpX2J1cywgZGV2Zm4sIFBDSV9CUklER0VfQ09OVFJPTCwgJkJDUik7CiAJCQkJaWYgKHJjKQotCQkJCQlyZXR1cm4gcmM7CisJCQkJCXJldHVybiAtRU5PREVWOwogCiAJCQkJLyogSWYgdGhlIFZHQSBFbmFibGUgYml0IGlzIHNldCwgcmVtb3ZlIGlzbid0IHN1cHBvcnRlZCAqLwogCQkJCWlmIChCQ1IgJiBQQ0lfQlJJREdFX0NUTF9WR0EpIHsKQEAgLTIwNDIsMTIgKzIwNDIsMTIgQEAKIAlpZiAoKGZ1bmMgIT0gTlVMTCkgJiYgIXJjKSB7CiAJCXJjID0gcmVtb3ZlX2JvYXJkKGZ1bmMsIHBfc2xvdC0+Y3RybCk7CiAJfSBlbHNlIGlmICghcmMpCi0JCXJjID0gMTsKKwkJcmMgPSAtRU5PREVWOwogCiAJaWYgKHBfc2xvdCkKIAkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCi0JcmV0dXJuKHJjKTsKKwlyZXR1cm4gcmM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCA4NTY4YjIwLi42Y2EwMDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtNzMsNiArNzMsMTcgQEAKIAlyZXR1cm4gKHN0ciAtIGJ1Zik7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJwY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4XG4iLAorCQkgICAgICAgcGNpX2Rldi0+dmVuZG9yLCBwY2lfZGV2LT5kZXZpY2UsCisJCSAgICAgICBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkgICAgICAgKHU4KShwY2lfZGV2LT5jbGFzcyA+PiAxNiksICh1OCkocGNpX2Rldi0+Y2xhc3MgPj4gOCksCisJCSAgICAgICAodTgpKHBjaV9kZXYtPmNsYXNzKSk7Cit9CisKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjaV9kZXZfYXR0cnNbXSA9IHsKIAlfX0FUVFJfUk8ocmVzb3VyY2UpLAogCV9fQVRUUl9STyh2ZW5kb3IpLApAQCAtODIsNiArOTMsNyBAQAogCV9fQVRUUl9STyhjbGFzcyksCiAJX19BVFRSX1JPKGlycSksCiAJX19BVFRSX1JPKGxvY2FsX2NwdXMpLAorCV9fQVRUUl9STyhtb2RhbGlhcyksCiAJX19BVFRSX05VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oCmluZGV4IDc5Y2RjMTYuLjc0NGRhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0zMiwzMyArMzIsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGNpX2J1c19tYXhfYnVzbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBleHRlcm4gaW50IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBjYXApOwogCi1zdHJ1Y3QgcGNpX2Rldl93cmFwcGVkIHsKLQlzdHJ1Y3QgcGNpX2RldgkqZGV2OwotCXZvaWQJCSpkYXRhOwotfTsKLQotc3RydWN0IHBjaV9idXNfd3JhcHBlZCB7Ci0Jc3RydWN0IHBjaV9idXMJKmJ1czsKLQl2b2lkCQkqZGF0YTsKLX07Ci0KLXN0cnVjdCBwY2lfdmlzaXQgewotCWludCAoKiBwcmVfdmlzaXRfcGNpX2J1cykJKHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgKiwKLQkJCQkJIHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKik7Ci0JaW50ICgqIHBvc3RfdmlzaXRfcGNpX2J1cykJKHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgKiwKLQkJCQkJIHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKik7Ci0KLQlpbnQgKCogcHJlX3Zpc2l0X3BjaV9kZXYpCShzdHJ1Y3QgcGNpX2Rldl93cmFwcGVkICosCi0JCQkJCSBzdHJ1Y3QgcGNpX2J1c193cmFwcGVkICopOwotCWludCAoKiB2aXNpdF9wY2lfZGV2KQkJKHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKiwKLQkJCQkJIHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgKik7Ci0JaW50ICgqIHBvc3RfdmlzaXRfcGNpX2RldikJKHN0cnVjdCBwY2lfZGV2X3dyYXBwZWQgKiwKLQkJCQkJIHN0cnVjdCBwY2lfYnVzX3dyYXBwZWQgKik7Ci19OwotCi1leHRlcm4gaW50IHBjaV92aXNpdF9kZXYoc3RydWN0IHBjaV92aXNpdCAqZm4sCi0JCQkgc3RydWN0IHBjaV9kZXZfd3JhcHBlZCAqd3JhcHBlZF9kZXYsCi0JCQkgc3RydWN0IHBjaV9idXNfd3JhcHBlZCAqd3JhcHBlZF9wYXJlbnQpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9sZWdhY3lfZmlsZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIC8qIExvY2sgZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHBjaSBkZXZpY2UgYW5kIGJ1cyBsaXN0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCmluZGV4IDQwMzdhM2UuLjNlODRiNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKQEAgLTM5LDcgKzM5LDggQEAKIAkJZHJpdmVyLT5pZF90YWJsZS0+dmVuZG9yICE9IHBjaWVkZXYtPmlkLnZlbmRvcikgfHwKIAkgICAgICAgKGRyaXZlci0+aWRfdGFibGUtPmRldmljZSAhPSBQQ0lfQU5ZX0lEICYmCiAJCWRyaXZlci0+aWRfdGFibGUtPmRldmljZSAhPSBwY2llZGV2LT5pZC5kZXZpY2UpIHx8CQotCQlkcml2ZXItPmlkX3RhYmxlLT5wb3J0X3R5cGUgIT0gcGNpZWRldi0+aWQucG9ydF90eXBlIHx8CisJICAgICAgIChkcml2ZXItPmlkX3RhYmxlLT5wb3J0X3R5cGUgIT0gUENJRV9BTllfUE9SVCAmJgorCQlkcml2ZXItPmlkX3RhYmxlLT5wb3J0X3R5cGUgIT0gcGNpZWRldi0+aWQucG9ydF90eXBlKSB8fAogCQlkcml2ZXItPmlkX3RhYmxlLT5zZXJ2aWNlX3R5cGUgIT0gcGNpZWRldi0+aWQuc2VydmljZV90eXBlICkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDY2MTUwZDAuLmM0YWRlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMTU5Miw5ICsxNTkyLDkgQEAKIAogCS8qIFNldCB1cCBjaGFyYWN0ZXIgZGV2aWNlIGZvciB1c2VyIG1vZGUgY2xpZW50cyAqLwogCWkgPSByZWdpc3Rlcl9jaHJkZXYoMCwgInBjbWNpYSIsICZkc19mb3BzKTsKLQlpZiAoaSA9PSAtRUJVU1kpCisJaWYgKGkgPCAwKQogCQlwcmludGsoS0VSTl9OT1RJQ0UgInVuYWJsZSB0byBmaW5kIGEgZnJlZSBkZXZpY2UgIyBmb3IgIgotCQkgICAgICAgIkRyaXZlciBTZXJ2aWNlc1xuIik7CisJCSAgICAgICAiRHJpdmVyIFNlcnZpY2VzIChlcnJvcj0lZClcbiIsIGkpOwogCWVsc2UKIAkJbWFqb3JfZGV2ID0gaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggMDJjZmUyNC4uY2VlYjNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC03LDcgKzcsNyBAQAogICogQnVncmVwb3J0cy50by4uOiA8TGludXgzOTBAZGUuaWJtLmNvbT4KICAqIChDKSBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCAxOTk5LTIwMDEKICAqCi0gKiAkUmV2aXNpb246IDEuMTYxICQKKyAqICRSZXZpc2lvbjogMS4xNjQgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTE3NjYsMTAgKzE3NjYsMTAgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImRhc2RfZ2VuZXJpY19wcm9iZTogY291bGQgbm90IGFkZCBzeXNmcyBlbnRyaWVzICIKIAkJICAgICAgICJmb3IgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCX0gZWxzZSB7CisJCWNkZXYtPmhhbmRsZXIgPSAmZGFzZF9pbnRfaGFuZGxlcjsKIAl9CiAKLQljZGV2LT5oYW5kbGVyID0gJmRhc2RfaW50X2hhbmRsZXI7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzgwLDYgKzE3ODAsOCBAQAogewogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCisJY2Rldi0+aGFuZGxlciA9IE5VTEw7CisKIAlkYXNkX3JlbW92ZV9zeXNmc19maWxlcyhjZGV2KTsKIAlkZXZpY2UgPSBkYXNkX2RldmljZV9mcm9tX2NkZXYoY2Rldik7CiAJaWYgKElTX0VSUihkZXZpY2UpKQpAQCAtMTgxMCwxNCArMTgxMiwxNCBAQAogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCWludCBmZWF0dXJlX2RpYWcsIHJjOwogCi0JZmVhdHVyZV9kaWFnID0gZGFzZF9nZXRfZmVhdHVyZShjZGV2LCBEQVNEX0ZFQVRVUkVfVVNFRElBRyk7Ci0JaWYgKGZlYXR1cmVfZGlhZyA8IDApCi0JCXJldHVybiBmZWF0dXJlX2RpYWc7Ci0KIAlkZXZpY2UgPSBkYXNkX2NyZWF0ZV9kZXZpY2UoY2Rldik7CiAJaWYgKElTX0VSUihkZXZpY2UpKQogCQlyZXR1cm4gUFRSX0VSUihkZXZpY2UpOwogCisJZmVhdHVyZV9kaWFnID0gZGFzZF9nZXRfZmVhdHVyZShjZGV2LCBEQVNEX0ZFQVRVUkVfVVNFRElBRyk7CisJaWYgKGZlYXR1cmVfZGlhZyA8IDApCisJCXJldHVybiBmZWF0dXJlX2RpYWc7CisKIAlpZiAoZmVhdHVyZV9kaWFnKSB7CiAJICAJaWYgKCFkYXNkX2RpYWdfZGlzY2lwbGluZV9wb2ludGVyKSB7CiAJCSAgICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKaW5kZXggZTVmYTE3MC4uNjUwZDVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKQEAgLTgxLDEwICs4MSw2IEBACiBpbnQgaXJxaGl0PTA7CiAjZW5kaWYKIAotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmF1cm9yYV9kcml2ZXI7CiBzdGF0aWMgc3RydWN0IEF1cm9yYV9ib2FyZCBhdXJvcmFfYm9hcmRbQVVST1JBX05CT0FSRF0gPSB7CiAJezAsfSwKQEAgLTU5NCw3ICs1OTAsNyBAQAogCQkJCQkgICAgJmJwLT5yW2NoaXBdLT5yW0NEMTgwX1REUl0pOwogCQkJCXBvcnQtPkNPUjIgJj0gfkNPUjJfRVRDOwogCQkJfQotCQkJY291bnQgPSBNSU4ocG9ydC0+YnJlYWtfbGVuZ3RoLCAweGZmKTsKKwkJCWNvdW50ID0gbWluKHBvcnQtPmJyZWFrX2xlbmd0aCwgMHhmZik7CiAJCQlzYnVzX3dyaXRlYihDRDE4MF9DX0VTQywKIAkJCQkgICAgJmJwLT5yW2NoaXBdLT5yW0NEMTgwX1REUl0pOwogCQkJc2J1c193cml0ZWIoQ0QxODBfQ19ERUxBWSwKQEAgLTE1NzUsNyArMTU3MSw3IEBACiAJc2F2ZV9mbGFncyhmbGFncyk7CiAJd2hpbGUgKDEpIHsKIAkJY2xpKCk7Ci0JCWMgPSBNSU4oY291bnQsIE1JTihTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxLAorCQljID0gbWluKGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMSwKIAkJCQkgICBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkKSk7CiAJCWlmIChjIDw9IDApIHsKIAkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzBfb3NtLmMKaW5kZXggYzJiNDdmMi4uNjgyY2EwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwX29zbS5jCkBAIC00MSw3ICs0MSw2IEBACiAKICNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KIApAQCAtNjIsMTMgKzYxLDYgQEAKIH07CiAKIHR5cGVkZWYgIHN0cnVjdCBkZXZpY2UgKmFpYzc3NzBfZGV2X3Q7Ci0jZWxzZQotI2RlZmluZSBNSU5TTE9UCQkJMQotI2RlZmluZSBOVU1TTE9UUwkJMTYKLSNkZWZpbmUgSURPRkZTRVQJCTB4ODAKLQotdHlwZWRlZiB2b2lkICphaWM3NzcwX2Rldl90OwotI2VuZGlmCiAKIHN0YXRpYyBpbnQgYWljNzc3MF9saW51eF9jb25maWcoc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKmVudHJ5LAogCQkJCWFpYzc3NzBfZGV2X3QgZGV2LCB1X2ludCBlaXNhQmFzZSk7CkBAIC03Niw3ICs2OCw2IEBACiBpbnQKIGFoY19saW51eF9laXNhX2luaXQodm9pZCkKIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJc3RydWN0IGVpc2FfZGV2aWNlX2lkICplaWQ7CiAJc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKmlkOwogCWludCBpOwpAQCAtMTEwLDQ0ICsxMDEsNiBAQAogCWVpZC0+c2lnWzBdID0gMDsKIAogCXJldHVybiBlaXNhX2RyaXZlcl9yZWdpc3RlcigmYWljNzc3MF9kcml2ZXIpOwotI2Vsc2UgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApICovCi0Jc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKmVudHJ5OwotCXVfaW50ICBzbG90OwotCXVfaW50ICBlaXNhQmFzZTsKLQl1X2ludCAgaTsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQotCWlmIChhaWM3eHh4X3Byb2JlX2Vpc2FfdmwgPT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWVpc2FCYXNlID0gMHgxMDAwICsgQUhDX0VJU0FfU0xPVF9PRkZTRVQ7Ci0JZm9yIChzbG90ID0gMTsgc2xvdCA8IE5VTVNMT1RTOyBlaXNhQmFzZSs9MHgxMDAwLCBzbG90KyspIHsKLQkJdWludDMyX3QgZWlzYV9pZDsKLQkJc2l6ZV90CSBpZF9zaXplOwotCi0JCWlmIChyZXF1ZXN0X3JlZ2lvbihlaXNhQmFzZSwgQUhDX0VJU0FfSU9TSVpFLCAiYWljN3h4eCIpID09IDApCi0JCQljb250aW51ZTsKLQotCQllaXNhX2lkID0gMDsKLQkJaWRfc2l6ZSA9IHNpemVvZihlaXNhX2lkKTsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJLyogVkxjYXJkcyByZXF1aXJlIHByaW1pbmcqLwotCQkJb3V0YigweDgwICsgaSwgZWlzYUJhc2UgKyBJRE9GRlNFVCk7Ci0JCQllaXNhX2lkIHw9IGluYihlaXNhQmFzZSArIElET0ZGU0VUICsgaSkKLQkJCQkgICA8PCAoKGlkX3NpemUtaS0xKSAqIDgpOwotCQl9Ci0JCXJlbGVhc2VfcmVnaW9uKGVpc2FCYXNlLCBBSENfRUlTQV9JT1NJWkUpOwotCQlpZiAoZWlzYV9pZCAmIDB4ODAwMDAwMDApCi0JCQljb250aW51ZTsgIC8qIG5vIEVJU0EgY2FyZCBpbiBzbG90ICovCi0KLQkJZW50cnkgPSBhaWM3NzcwX2ZpbmRfZGV2aWNlKGVpc2FfaWQpOwotCQlpZiAoZW50cnkgIT0gTlVMTCkgewotCQkJYWljNzc3MF9saW51eF9jb25maWcoZW50cnksIE5VTEwsIGVpc2FCYXNlKTsKLQkJCXJldCA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLSNlbmRpZgogfQogCiB2b2lkCkBAIC0xODcsMTEgKzE0MCwxMCBAQAogCQlhaGNfZnJlZShhaGMpOwogCQlyZXR1cm4gKGVycm9yKTsKIAl9Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCiAJZGV2LT5kcml2ZXJfZGF0YSA9ICh2b2lkICopYWhjOwogCWlmIChhaWM3eHh4X2RldGVjdF9jb21wbGV0ZSkKIAkJZXJyb3IgPSBhaGNfbGludXhfcmVnaXN0ZXJfaG9zdChhaGMsICZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7Ci0jZW5kaWYKIAlyZXR1cm4gKGVycm9yKTsKIH0KIApAQCAtMjI1LDcgKzE3Nyw2IEBACiAJcmV0dXJuICgtZXJyb3IpOwogfQogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogc3RhdGljIGludAogYWljNzc3MF9laXNhX2Rldl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0yNjEsNCArMjEyLDMgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCmluZGV4IGQ5NzhlNGEuLmMxM2U1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwpAQCAtMTM0LDExICsxMzQsNiBAQAogI2luY2x1ZGUgImFpY2xpYi5jIgogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19zZXR1cCAqLwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaW5jbHVkZSAic2QuaCIJCQkvKiBGb3IgZ2VvbWV0cnkgZGV0ZWN0aW9uICovCi0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBGb3IgZmV0Y2hpbmcgc3lzdGVtIG1lbW9yeSBzaXplICovCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiBGb3IgYmxvY2tfc2l6ZSgpICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHNzbGVlcC9tc2xlZXAgKi8KQEAgLTE0OCwxMSArMTQzLDYgQEAKICAqLwogc3BpbmxvY2tfdCBhaGNfbGlzdF9zcGlubG9jazsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotLyogRm9yIGR5bmFtaWMgc2dsaXN0IHNpemUgY2FsY3VsYXRpb24uICovCi11X2ludCBhaGNfbGludXhfbnNlZzsKLSNlbmRpZgotCiAvKgogICogU2V0IHRoaXMgdG8gdGhlIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgU0NTSSBidXMgcmVzZXQuCiAgKiBOb3RlLCB3ZSBob25vciB0aGlzIG9ubHkgZm9yIHRoZSBpbml0aWFsIGJ1cyByZXNldC4KQEAgLTQzNiwxNSArNDI2LDEyIEBACiAJCQkJCSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqLAogCQkJCQkgc3RydWN0IHNjYiAqKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAotCQkJCQkgU2NzaV9DbW5kICpjbWQpOworCQkJCQkgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogc3RhdGljIHZvaWQgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcSh1X2xvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIGFoY19saW51eF9kZXZfdGltZWRfdW5mcmVlemUodV9sb25nIGFyZyk7Ci1zdGF0aWMgaW50ICBhaGNfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKFNjc2lfQ21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKK3N0YXRpYyBpbnQgIGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci1zdGF0aWMgdm9pZCBhaGNfbGludXhfc2l6ZV9uc2VnKHZvaWQpOwotc3RhdGljIHZvaWQgYWhjX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHN0YXRpYyB1X2ludCBhaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCiAJCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOwogc3RhdGljIHZvaWQgYWhjX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCkBAIC00NTgsNTQgKzQ0NSwyNyBAQAogCQkJCQkJICAgICAgIHVfaW50KTsKIHN0YXRpYyB2b2lkCQkJYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMqLAogCQkJCQkJICAgICAgc3RydWN0IGFoY19saW51eF9kZXZpY2UqKTsKLXN0YXRpYyB2b2lkIGFoY19saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMqLAotCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSopOworc3RhdGljIGludCBhaGNfbGludXhfcnVuX2NvbW1hbmQoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICosCisJCQkJIHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgdm9pZCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApOwogc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm87CiBzdGF0aWMgaW50ICBhaWM3eHh4X3NldHVwKGNoYXIgKnMpOwogc3RhdGljIGludCAgYWhjX2xpbnV4X25leHRfdW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIGFoY19ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgYWhjX2NtZCAqYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElubGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NjaGVkdWxlX3J1bnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSoKIAkJICAgICBhaGNfbGludXhfZ2V0X2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGNoYW5uZWwsCi0JCQkJCSAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGludCBhbGxvYyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKLQkJCQkJCSAgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKgotCQkgICAgIGFoY19saW51eF9uZXh0X2RldmljZV90b19ydW4oc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworCQkJCQkgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoY19zb2Z0YyosIHN0cnVjdCBzY2IqKTsKIAogc3RhdGljIF9faW5saW5lIGludCBhaGNfbGludXhfbWFwX3NlZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwKIAkJIAkJICAgICAgc3RydWN0IGFoY19kbWFfc2VnICpzZywKIAkJCQkgICAgICBkbWFfYWRkcl90IGFkZHIsIGJ1c19zaXplX3QgbGVuKTsKIAotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQotewotCWlmICgoYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIQ19SVU5fQ01QTFRfUV9USU1FUikgPT0gMCkgewotCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19SVU5fQ01QTFRfUV9USU1FUjsKLQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7Ci0JCWFkZF90aW1lcigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCX0KLX0KLQotLyoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KLSAqLwotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19zY2hlZHVsZV9ydW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKLXsKLQl0YXNrbGV0X3NjaGVkdWxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCk7Ci19Ci0KIHN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSoKIGFoY19saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0LAotCQkgICAgIHVfaW50IGx1biwgaW50IGFsbG9jKQorCQkgICAgIHVfaW50IGx1bikKIHsKIAlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKIAlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OwpAQCAtNTE1LDEwMiArNDc1LDE1IEBACiAJaWYgKGNoYW5uZWwgIT0gMCkKIAkJdGFyZ2V0X29mZnNldCArPSA4OwogCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07Ci0JaWYgKHRhcmcgPT0gTlVMTCkgewotCQlpZiAoYWxsb2MgIT0gMCkgewotCQkJdGFyZyA9IGFoY19saW51eF9hbGxvY190YXJnZXQoYWhjLCBjaGFubmVsLCB0YXJnZXQpOwotCQkJaWYgKHRhcmcgPT0gTlVMTCkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQl9IGVsc2UKLQkJCXJldHVybiAoTlVMTCk7Ci0JfQorCUJVR19PTih0YXJnID09IE5VTEwpOwogCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKLQlpZiAoZGV2ID09IE5VTEwgJiYgYWxsb2MgIT0gMCkKLQkJZGV2ID0gYWhjX2xpbnV4X2FsbG9jX2RldmljZShhaGMsIHRhcmcsIGx1bik7Ci0JcmV0dXJuIChkZXYpOwotfQotCi0jZGVmaW5lIEFIQ19MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTIDQKLXN0YXRpYyBzdHJ1Y3QgYWhjX2NtZCAqCi1haGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKLXsKLQlzdHJ1Y3QJYWhjX2NtZCAqYWNtZDsKLQl1X2xvbmcJZG9uZV9mbGFnczsKLQlpbnQJd2l0aF9lcnJvcnM7Ci0KLQl3aXRoX2Vycm9ycyA9IDA7Ci0JYWhjX2RvbmVfbG9jayhhaGMsICZkb25lX2ZsYWdzKTsKLQl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXEpKSAhPSBOVUxMKSB7Ci0JCVNjc2lfQ21uZCAqY21kOwotCi0JCWlmICh3aXRoX2Vycm9ycyA+IEFIQ19MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTKSB7Ci0JCQkvKgotCQkJICogTGludXggdXNlcyBzdGFjayByZWN1cnNpb24gdG8gcmVxdWV1ZQotCQkJICogY29tbWFuZHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZWQuICBBdm9pZAotCQkJICogYmxvd2luZyBvdXQgdGhlIHN0YWNrIGJ5ICJzcG9vbiBmZWVkaW5nIgotCQkJICogY29tbWFuZHMgdGhhdCBjb21wbGV0ZWQgd2l0aCBlcnJvciBiYWNrCi0JCQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpbiBjYXNlIHRoZXkgYXJlIGdvaW5nCi0JCQkgKiB0byBiZSByZXRyaWVkLiAiaWNrIgotCQkJICovCi0JCQlhaGNfc2NoZWR1bGVfY29tcGxldGVxKGFoYyk7Ci0JCQlicmVhazsKLQkJfQotCQlUQUlMUV9SRU1PVkUoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxLAotCQkJICAgICBhY21kLCBhY21kX2xpbmtzLnRxZSk7Ci0JCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOwotCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotCQlpZiAoYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkgIT0gRElEX09LCi0JCSB8fCAoY21kLT5yZXN1bHQgJiAweEZGKSAhPSBTQ1NJX1NUQVRVU19PSykKLQkJCXdpdGhfZXJyb3JzKys7Ci0KLQkJY21kLT5zY3NpX2RvbmUoY21kKTsKLQl9Ci0JYWhjX2RvbmVfdW5sb2NrKGFoYywgJmRvbmVfZmxhZ3MpOwotCXJldHVybiAoYWNtZCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKLQkJCSAgICAgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldikKLXsKLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX0ZSRUVaRV9USUxfRU1QVFkpICE9IDAKLQkgJiYgZGV2LT5hY3RpdmUgPT0gMCkgewotCQlkZXYtPmZsYWdzICY9IH5BSENfREVWX0ZSRUVaRV9USUxfRU1QVFk7Ci0JCWRldi0+cWZyb3plbi0tOwotCX0KLQotCWlmIChUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkgPT0gTlVMTAotCSB8fCBkZXYtPm9wZW5pbmdzID09IDAgfHwgZGV2LT5xZnJvemVuICE9IDApCi0JCXJldHVybjsKLQotCWFoY19saW51eF9ydW5fZGV2aWNlX3F1ZXVlKGFoYywgZGV2KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICoKLWFoY19saW51eF9uZXh0X2RldmljZV90b19ydW4oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQotewotCQotCWlmICgoYWhjLT5mbGFncyAmIEFIQ19SRVNPVVJDRV9TSE9SVEFHRSkgIT0gMAotCSAgICB8fCAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDApKQotCQlyZXR1cm4gKE5VTEwpOwotCXJldHVybiAoVEFJTFFfRklSU1QoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEpKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0Jc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKLQotCXdoaWxlICgoZGV2ID0gYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpKSAhPSBOVUxMKSB7Ci0JCVRBSUxRX1JFTU9WRSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7Ci0JCWRldi0+ZmxhZ3MgJj0gfkFIQ19ERVZfT05fUlVOX0xJU1Q7Ci0JCWFoY19saW51eF9jaGVja19kZXZpY2VfcXVldWUoYWhjLCBkZXYpOwotCX0KKwlyZXR1cm4gZGV2OwogfQogCiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhjX2xpbnV4X3VubWFwX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKIHsKLQlTY3NpX0NtbmQgKmNtZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKIAljbWQgPSBzY2ItPmlvX2N0eDsKIAlhaGNfc3luY19zZ2xpc3QoYWhjLCBzY2IsIEJVU19ETUFTWU5DX1BPU1RXUklURSk7CkBAIC02NTAsMTA5ICs1MjMsMTUgQEAKIAlyZXR1cm4gKGNvbnN1bWVkKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiAgSG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7Ci1zdGF0aWMgaW50CSAgIGFoY19saW51eF9xdWV1ZShTY3NpX0NtbmQgKiwgdm9pZCAoKikoU2NzaV9DbW5kICopKTsKLXN0YXRpYyBjb25zdCBjaGFyICphaGNfbGludXhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBpbnQJICAgYWhjX2xpbnV4X3NsYXZlX2FsbG9jKFNjc2lfRGV2aWNlICopOwotc3RhdGljIGludAkgICBhaGNfbGludXhfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICopOwotc3RhdGljIHZvaWQJICAgYWhjX2xpbnV4X3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKik7Ci0jaWYgZGVmaW5lZChfX2kzODZfXykKLXN0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlKiwKLQkJCQkgICAgICAgc2VjdG9yX3QsIGludFtdKTsKLSNlbmRpZgotI2Vsc2UKLXN0YXRpYyBpbnQJICAgYWhjX2xpbnV4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKLXN0YXRpYyB2b2lkCSAgIGFoY19saW51eF9zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKLQkJCQkJCVNjc2lfRGV2aWNlICpzY3NpX2RldnMpOwotI2lmIGRlZmluZWQoX19pMzg2X18pCi1zdGF0aWMgaW50CSAgIGFoY19saW51eF9iaW9zcGFyYW0oRGlzayAqLCBrZGV2X3QsIGludFtdKTsKLSNlbmRpZgotI2VuZGlmCi1zdGF0aWMgaW50CSAgIGFoY19saW51eF9idXNfcmVzZXQoU2NzaV9DbW5kICopOwotc3RhdGljIGludAkgICBhaGNfbGludXhfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqKTsKLXN0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2Fib3J0KFNjc2lfQ21uZCAqKTsKLQotLyoKLSAqIENhbGN1bGF0ZSBhIHNhZmUgdmFsdWUgZm9yIEFIQ19OU0VHIChhcyBleHByZXNzZWQgdGhyb3VnaCBhaGNfbGludXhfbnNlZykuCi0gKgotICogSW4gcHJlLTIuNS5YLi4uCi0gKiBUaGUgbWlkbGF5ZXIgYWxsb2NhdGVzIGFuIFMvRyBhcnJheSBkeW5hbWljYWxseSB3aGVuIGEgY29tbWFuZCBpcyBpc3N1ZWQKLSAqIHVzaW5nIFNDU0kgbWFsbG9jLiAgVGhpcyBhcnJheSwgd2hpY2ggaXMgaW4gYW4gT1MgZGVwZW5kZW50IGZvcm1hdCB0aGF0Ci0gKiBtdXN0IGxhdGVyIGJlIGNvcGllZCB0byBvdXIgcHJpdmF0ZSBTL0cgbGlzdCwgaXMgc2l6ZWQgdG8gaG91c2UganVzdCB0aGUKLSAqIG51bWJlciBvZiBzZWdtZW50cyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyLiAgU2luY2UgdGhlIGNvZGUgdGhhdAotICogc2l6ZXMgdGhlIFNDU0kgbWFsbG9jIHBvb2wgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gZnJhZ21lbnRhdGlvbgotICogb2YgdGhlIHBvb2wsIGV4ZWN1dGluZyB0cmFuc2FjdGlvbnMgbnVtYmVyaW5nIGp1c3QgYSBmcmFjdGlvbiBvZiBvdXIKLSAqIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gbGltaXQgd2l0aCBsaXN0IGxlbmd0aHMgYXByb2FjaGluZyBBSENfTlNFRyB3aWxsCi0gKiBxdWlja2x5IGRlcGxlYXQgdGhlIFNDU0kgbWFsbG9jIHBvb2wgb2YgdXNhYmxlIHNwYWNlLiAgVW5mb3J0dW5hdGVseSwgdGhlCi0gKiBtaWQtbGF5ZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHRoaXMgc2NzaSBtYWxsb2MgZmFpbHVyZXMgZm9yIHRoZSBTL0cKLSAqIGFycmF5IGFuZCB0aGUgcmVzdWx0IGNhbiBiZSBhIGxvY2t1cCBvZiB0aGUgSS9PIHN1YnN5c3RlbS4gIFdlIHRyeSB0byBzaXplCi0gKiBvdXIgUy9HIGxpc3Qgc28gdGhhdCBpdCBzYXRpc2ZpZXMgb3VyIGRyaXZlcnMgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgaW4KLSAqIGFkZGl0aW9uIHRvIGF2b2lkaW5nIGZyYWdtZW50YXRpb24gb2YgdGhlIFNDU0kgbWFsbG9jIHBvb2wuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGNfbGludXhfc2l6ZV9uc2VnKHZvaWQpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JdV9pbnQgY3VyX3NpemU7Ci0JdV9pbnQgYmVzdF9zaXplOwotCi0JLyoKLQkgKiBUaGUgU0NTSSBhbGxvY2F0b3Igcm91bmRzIHRvIHRoZSBuZWFyZXN0IDUxMiBieXRlcwotCSAqIGFuIGNhbm5vdCBhbGxvY2F0ZSBhY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAgT3VyIGFsZ29yaXRobQotCSAqIGlzIHRvIHN0YXJ0IGF0IDFLIG9mIHNjc2kgbWFsbG9jIHNwYWNlIHBlci1jb21tYW5kIGFuZAotCSAqIGxvb3AgdGhyb3VnaCBhbGwgZmFjdG9ycyBvZiB0aGUgUEFHRV9TSVpFIGFuZCBwaWNrIHRoZSBiZXN0LgotCSAqLwotCWJlc3Rfc2l6ZSA9IDA7Ci0JZm9yIChjdXJfc2l6ZSA9IDEwMjQ7IGN1cl9zaXplIDw9IFBBR0VfU0laRTsgY3VyX3NpemUgKj0gMikgewotCQl1X2ludCBuc2VnOwotCi0JCW5zZWcgPSBjdXJfc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOwotCQlpZiAobnNlZyA8IEFIQ19MSU5VWF9NSU5fTlNFRykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiZXN0X3NpemUgPT0gMCkgewotCQkJYmVzdF9zaXplID0gY3VyX3NpemU7Ci0JCQlhaGNfbGludXhfbnNlZyA9IG5zZWc7Ci0JCX0gZWxzZSB7Ci0JCQl1X2ludCBiZXN0X3JlbTsKLQkJCXVfaW50IGN1cl9yZW07Ci0KLQkJCS8qCi0JCQkgKiBDb21wYXJlIHRoZSB0cmFpdHMgb2YgdGhlIGN1cnJlbnQgImJlc3Rfc2l6ZSIKLQkJCSAqIHdpdGggdGhlIGN1cnJlbnQgc2l6ZSB0byBkZXRlcm1pbmUgaWYgdGhlCi0JCQkgKiBjdXJyZW50IHNpemUgaXMgYSBiZXR0ZXIgc2l6ZS4KLQkJCSAqLwotCQkJYmVzdF9yZW0gPSBiZXN0X3NpemUgJSBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKLQkJCWN1cl9yZW0gPSBjdXJfc2l6ZSAlIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOwotCQkJaWYgKGN1cl9yZW0gPCBiZXN0X3JlbSkgewotCQkJCWJlc3Rfc2l6ZSA9IGN1cl9zaXplOwotCQkJCWFoY19saW51eF9uc2VnID0gbnNlZzsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotfQotCiAvKgogICogVHJ5IHRvIGRldGVjdCBhbiBBZGFwdGVjIDdYWFggY29udHJvbGxlci4KICAqLwogc3RhdGljIGludAotYWhjX2xpbnV4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlKQorYWhjX2xpbnV4X2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0ZW1wbGF0ZSkKIHsKIAlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CiAJaW50ICAgICBmb3VuZCA9IDA7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkvKgotCSAqIEl0IGlzIGEgYnVnIHRoYXQgdGhlIHVwcGVyIGxheWVyIHRha2VzCi0JICogdGhpcyBsb2NrIGp1c3QgcHJpb3IgdG8gY2FsbGluZyB1cy4KLQkgKi8KLQlzcGluX3VubG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKLQogCS8qCiAJICogU2FuaXR5IGNoZWNraW5nIG9mIExpbnV4IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIHNvCiAJICogdGhhdCBzb21lIG9mIG91ciBoYWNrc15IXkheSF5IXkhhc3N1bXB0aW9ucyBhcmVuJ3QKQEAgLTc2NCw3ICs1NDMsNiBAQAogCQlwcmludGYoImFoY19saW51eF9kZXRlY3Q6IFVuYWJsZSB0byBhdHRhY2hcbiIpOwogCQlyZXR1cm4gKDApOwogCX0KLQlhaGNfbGludXhfc2l6ZV9uc2VnKCk7CiAJLyoKIAkgKiBJZiB3ZSd2ZSBiZWVuIHBhc3NlZCBhbnkgcGFyYW1ldGVycywgcHJvY2VzcyB0aGVtIG5vdy4KIAkgKi8KQEAgLTc5Myw0OCArNTcxLDExIEBACiAJCQlmb3VuZCsrOwogCX0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXNwaW5fbG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKIAlhaWM3eHh4X2RldGVjdF9jb21wbGV0ZSsrOwogCiAJcmV0dXJuIChmb3VuZCk7CiB9CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLS8qCi0gKiBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKLSAqIG1vZHVsZS4KLSAqLwotaW50Ci1haGNfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKLXsKLQlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7Ci0JdV9sb25nIGw7Ci0KLQlhaGNfbGlzdF9sb2NrKCZsKTsKLQlpZiAoaG9zdCAhPSBOVUxMKSB7Ci0KLQkJLyoKLQkJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCi0JCSAqIHRoZSBmcmVlIGRpcmVjdGx5LCBidXQgY2hlY2sgb3VyCi0JCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KLQkJICovCi0JCWFoYyA9IGFoY19maW5kX3NvZnRjKCooc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSk7Ci0JCWlmIChhaGMgIT0gTlVMTCkgewotCQkJdV9sb25nIHM7Ci0KLQkJCWFoY19sb2NrKGFoYywgJnMpOwotCQkJYWhjX2ludHJfZW5hYmxlKGFoYywgRkFMU0UpOwotCQkJYWhjX3VubG9jayhhaGMsICZzKTsKLQkJCWFoY19mcmVlKGFoYyk7Ci0JCX0KLQl9Ci0JYWhjX2xpc3RfdW5sb2NrKCZsKTsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmCi0KIC8qCiAgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgogICovCkBAIC04NjcsMTEgKzYwOCwxMCBAQAogICogUXVldWUgYW4gU0NCIHRvIHRoZSBjb250cm9sbGVyLgogICovCiBzdGF0aWMgaW50Ci1haGNfbGludXhfcXVldWUoU2NzaV9DbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoU2NzaV9DbW5kICopKQorYWhjX2xpbnV4X3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQsIHZvaWQgKCpzY3NpX2RvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCXN0cnVjdAkgYWhjX3NvZnRjICphaGM7CiAJc3RydWN0CSBhaGNfbGludXhfZGV2aWNlICpkZXY7Ci0JdV9sb25nCSBmbGFnczsKIAogCWFoYyA9ICooc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAKQEAgLTg4MCwyMDUgKzYyMCwxNTIgQEAKIAkgKi8KIAljbWQtPnNjc2lfZG9uZSA9IHNjc2lfZG9uZTsKIAotCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmZmxhZ3MpOwotCiAJLyoKIAkgKiBDbG9zZSB0aGUgcmFjZSBvZiBhIGNvbW1hbmQgdGhhdCB3YXMgaW4gdGhlIHByb2Nlc3Mgb2YKIAkgKiBiZWluZyBxdWV1ZWQgdG8gdXMganVzdCBhcyBvdXIgc2ltcSB3YXMgZnJvemVuLiAgTGV0CiAJICogRFYgY29tbWFuZHMgdGhyb3VnaCBzbyBsb25nIGFzIHdlIGFyZSBvbmx5IGZyb3plbiB0bwogCSAqIHBlcmZvcm0gRFYuCiAJICovCi0JaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwKSB7CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAotCQlhaGNfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBDQU1fUkVRVUVVRV9SRVEpOwotCQlhaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoYywgY21kKTsKLQkJYWhjX3NjaGVkdWxlX2NvbXBsZXRlcShhaGMpOwotCQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOwotCQlyZXR1cm4gKDApOwotCX0KIAlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCQkJICAgY21kLT5kZXZpY2UtPmx1biwgLyphbGxvYyovVFJVRSk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVNSQ19VTkFWQUlMKTsKLQkJYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGMsIGNtZCk7Ci0JCWFoY19zY2hlZHVsZV9jb21wbGV0ZXEoYWhjKTsKLQkJYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoYywgJmZsYWdzKTsKLQkJcHJpbnRmKCIlczogYWljN3h4eF9saW51eF9xdWV1ZSAtIFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UhXG4iLAotCQkgICAgICAgYWhjX25hbWUoYWhjKSk7Ci0JCXJldHVybiAoMCk7Ci0JfQorCQkJCSAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCUJVR19PTihkZXYgPT0gTlVMTCk7CisKIAljbWQtPnJlc3VsdCA9IENBTV9SRVFfSU5QUk9HIDw8IDE2OwotCVRBSUxRX0lOU0VSVF9UQUlMKCZkZXYtPmJ1c3lxLCAoc3RydWN0IGFoY19jbWQgKiljbWQsIGFjbWRfbGlua3MudHFlKTsKLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX09OX1JVTl9MSVNUKSA9PSAwKSB7Ci0JCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKLQkJZGV2LT5mbGFncyB8PSBBSENfREVWX09OX1JVTl9MSVNUOwotCQlhaGNfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoYWhjKTsKLQl9Ci0JYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoYywgJmZsYWdzKTsKLQlyZXR1cm4gKDApOworCisJcmV0dXJuIGFoY19saW51eF9ydW5fY29tbWFuZChhaGMsIGRldiwgY21kKTsKIH0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBpbnQKLWFoY19saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQorYWhjX2xpbnV4X3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBkZXZpY2UtPnNkZXZfdGFyZ2V0OworCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50IHRhcmdldF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCXRhcmdldF9vZmZzZXQgPSBzdGFyZ2V0LT5pZDsKKwlpZiAoc3RhcmdldC0+Y2hhbm5lbCAhPSAwKQorCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CiAKIAlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOwogCWlmIChib290dmVyYm9zZSkKIAkJcHJpbnRmKCIlczogU2xhdmUgQWxsb2MgJWRcbiIsIGFoY19uYW1lKGFoYyksIGRldmljZS0+aWQpOwotCXJldHVybiAoMCk7CisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJaWYgKHRhcmcgPT0gTlVMTCkgeworCQlzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjOworCisJCXRhcmcgPSBhaGNfbGludXhfYWxsb2NfdGFyZ2V0KGFoYywgc3RhcmdldC0+Y2hhbm5lbCwKKwkJCQkJCXN0YXJnZXQtPmlkKTsKKwkJc2MgPSBhaGMtPnNlZXBfY29uZmlnOworCQlpZiAodGFyZyA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHNjKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBzY3NpcmF0ZTsKKwkJCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOworCQkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQkJc3RydWN0IGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwkJCWNoYXIgY2hhbm5lbCA9IHN0YXJnZXQtPmNoYW5uZWwgKyAnQSc7CisJCQl1bnNpZ25lZCBpbnQgb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisKKwkJCWlmIChzdGFyZ2V0LT5jaGFubmVsKQorCQkJCW91cl9pZCA9IGFoYy0+b3VyX2lkX2I7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJCQlzY3NpcmF0ZSA9IHNjLT5kZXZpY2VfZmxhZ3NbdGFyZ2V0X29mZnNldF0gJiBDRlhGRVI7CisJCQl9IGVsc2UgeworCQkJCXNjc2lyYXRlID0gKHNjLT5kZXZpY2VfZmxhZ3NbdGFyZ2V0X29mZnNldF0gJiBDRlhGRVIpIDw8IDQ7CisJCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbdGFyZ2V0X29mZnNldF0gJiBDRlNZTkNIKQorCQkJCQlzY3NpcmF0ZSB8PSBTT0ZTOworCQkJfQorCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbdGFyZ2V0X29mZnNldF0gJiBDRldJREVCKSB7CisJCQkJc2NzaXJhdGUgfD0gV0lERVhGRVI7CisJCQkJc3BpX21heF93aWR0aChzdGFyZ2V0KSA9IDE7CisJCQl9IGVsc2UKKwkJCQlzcGlfbWF4X3dpZHRoKHN0YXJnZXQpID0gMDsKKwkJCXNwaV9taW5fcGVyaW9kKHN0YXJnZXQpID0gCisJCQkJYWhjX2ZpbmRfcGVyaW9kKGFoYywgc2NzaXJhdGUsIEFIQ19TWU5DUkFURV9EVCk7CisJCQl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBjaGFubmVsLCBhaGMtPm91cl9pZCwKKwkJCQkJCSAgICB0YXJnLT50YXJnZXQsICZ0c3RhdGUpOworCQkJYWhjX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgb3VyX2lkLCB0YXJnLT50YXJnZXQsCisJCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCBjaGFubmVsLAorCQkJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLCBOVUxMLCAwLCAwLCAwLAorCQkJCQkgQUhDX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCQlhaGNfc2V0X3dpZHRoKGFoYywgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhDX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCX0KKwkJCQorCX0KKwlkZXYgPSB0YXJnLT5kZXZpY2VzW2RldmljZS0+bHVuXTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2ID0gYWhjX2xpbnV4X2FsbG9jX2RldmljZShhaGMsIHRhcmcsIGRldmljZS0+bHVuKTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCXJldHZhbCA9IDA7CisKKyBvdXQ6CisJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludAotYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQorYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CiAJc3RydWN0CWFoY19saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcJZmxhZ3M7CiAKIAlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCiAJaWYgKGJvb3R2ZXJib3NlKQogCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoY19uYW1lKGFoYyksIGRldmljZS0+aWQpOwotCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmZmxhZ3MpOwotCS8qCi0JICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQotCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKLQkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KLQkgKi8KLQlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmljZS0+Y2hhbm5lbCwKLQkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKLQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKLQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7Ci0JCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7Ci0JCWFoY19saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoYWhjLCBkZXYpOwotCX0KLQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCisJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBkZXZpY2UtPmNoYW5uZWwsIGRldmljZS0+aWQsCisJCQkJICAgZGV2aWNlLT5sdW4pOworCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7CisJYWhjX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChhaGMsIGRldik7CiAKIAkvKiBJbml0aWFsIERvbWFpbiBWYWxpZGF0aW9uICovCiAJaWYgKCFzcGlfaW5pdGlhbF9kdihkZXZpY2UtPnNkZXZfdGFyZ2V0KSkKIAkJc3BpX2R2X2RldmljZShkZXZpY2UpOwogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKLWFoY19saW51eF9zbGF2ZV9kZXN0cm95KFNjc2lfRGV2aWNlICpkZXZpY2UpCithaGNfbGludXhfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CiAJc3RydWN0CWFoY19saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcJZmxhZ3M7CiAKIAlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOwogCWlmIChib290dmVyYm9zZSkKIAkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhjX25hbWUoYWhjKSwgZGV2aWNlLT5pZCk7Ci0JYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGMsICZmbGFncyk7CiAJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBkZXZpY2UtPmNoYW5uZWwsCi0JCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCi0JCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKLQkvKgotCSAqIEZpbHRlciBvdXQgInNpbGx5IiBkZWxldGlvbnMgb2YgcmVhbCBkZXZpY2VzIGJ5IG9ubHkKLQkgKiBkZWxldGluZyBkZXZpY2VzIHRoYXQgaGF2ZSBoYWQgc2xhdmVfY29uZmlndXJlKCkKLQkgKiBjYWxsZWQgb24gdGhlbS4gIEFsbCBvdGhlciBkZXZpY2VzIHRoYXQgaGF2ZSBub3QKLQkgKiBiZWVuIGNvbmZpZ3VyZWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlbGV0ZWQgYnkKLQkgKiB0aGUgcmVmY291bnRpbmcgcHJvY2Vzcy4KLQkgKi8KLQlpZiAoZGV2ICE9IE5VTEwKLQkgJiYgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1NMQVZFX0NPTkZJR1VSRUQpICE9IDApIHsKLQkJZGV2LT5mbGFncyB8PSBBSENfREVWX1VOQ09ORklHVVJFRDsKLQkJaWYgKFRBSUxRX0VNUFRZKCZkZXYtPmJ1c3lxKQotCQkgJiYgZGV2LT5hY3RpdmUgPT0gMAotCSAJICYmIChkZXYtPmZsYWdzICYgQUhDX0RFVl9USU1FUl9BQ1RJVkUpID09IDApCi0JCQlhaGNfbGludXhfZnJlZV9kZXZpY2UoYWhjLCBkZXYpOwotCX0KLQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCQkJCSAgIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKworCUJVR19PTihkZXYtPmFjdGl2ZSk7CisKKwlhaGNfbGludXhfZnJlZV9kZXZpY2UoYWhjLCBkZXYpOwogfQotI2Vsc2UKLS8qCi0gKiBTZXRzIHRoZSBxdWV1ZSBkZXB0aCBmb3IgZWFjaCBTQ1NJIGRldmljZSBoYW5naW5nCi0gKiBvZmYgdGhlIGlucHV0IGhvc3QgYWRhcHRlci4KLSAqLwotc3RhdGljIHZvaWQKLWFoY19saW51eF9zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9EZXZpY2UgKnNjc2lfZGV2cykKLXsKLQlTY3NpX0RldmljZSAqZGV2aWNlOwotCVNjc2lfRGV2aWNlICpsZGV2OwotCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKLQl1X2xvbmcJZmxhZ3M7Ci0KLQlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKTsKLQlhaGNfbG9jayhhaGMsICZmbGFncyk7Ci0JZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpIHsKLQotCQkvKgotCQkgKiBXYXRjaCBvdXQgZm9yIGR1cGxpY2F0ZSBkZXZpY2VzLiAgVGhpcyB3b3JrcyBhcm91bmQKLQkJICogc29tZSBxdWlya3MgaW4gaG93IHRoZSBTQ1NJIHNjYW5uaW5nIGNvZGUgZG9lcyBpdHMKLQkJICogZGV2aWNlIG1hbmFnZW1lbnQuCi0JCSAqLwotCQlmb3IgKGxkZXYgPSBzY3NpX2RldnM7IGxkZXYgIT0gZGV2aWNlOyBsZGV2ID0gbGRldi0+bmV4dCkgewotCQkJaWYgKGxkZXYtPmhvc3QgPT0gZGV2aWNlLT5ob3N0Ci0JCQkgJiYgbGRldi0+Y2hhbm5lbCA9PSBkZXZpY2UtPmNoYW5uZWwKLQkJCSAmJiBsZGV2LT5pZCA9PSBkZXZpY2UtPmlkCi0JCQkgJiYgbGRldi0+bHVuID09IGRldmljZS0+bHVuKQotCQkJCWJyZWFrOwotCQl9Ci0JCS8qIFNraXAgZHVwbGljYXRlLiAqLwotCQlpZiAobGRldiAhPSBkZXZpY2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKLQkJCXN0cnVjdAkgYWhjX2xpbnV4X2RldmljZSAqZGV2OwotCi0JCQkvKgotCQkJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQotCQkJICogaXQgc28gd2UgZG9uJ3QgZnJlZSBhbmQgYWxsb2NhdGUgdGhlIGRldmljZQotCQkJICogc3RydWN0dXJlIG9uIGV2ZXJ5IGNvbW1hbmQuCi0JCQkgKi8KLQkJCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgZGV2aWNlLT5jaGFubmVsLAotCQkJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCi0JCQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKLQkJCWlmIChkZXYgIT0gTlVMTCkgewotCQkJCWRldi0+ZmxhZ3MgJj0gfkFIQ19ERVZfVU5DT05GSUdVUkVEOwotCQkJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7Ci0JCQkJYWhjX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChhaGMsIGRldik7Ci0JCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IGRldi0+b3BlbmluZ3MKLQkJCQkJCSAgICArIGRldi0+YWN0aXZlOwotCQkJCWlmICgoZGV2LT5mbGFncyAmIChBSENfREVWX1FfQkFTSUMKLQkJCQkJCXwgQUhDX0RFVl9RX1RBR0dFRCkpID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQKLQkJCQkJICogdHJhbnNhY3Rpb25zIHRvIHVzIGF0IGFueSB0aW1lIGV2ZW4KLQkJCQkJICogdGhvdWdoIHdlIGNhbiBvbmx5IGV4ZWN1dGUgdGhlbQotCQkJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuCi0JCQkJCSAqIFRoaXMgc2hvdWxkIHJlbW92ZSBzb21lIGxhdGVuY3kuCi0JCQkJCSAqLwotCQkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JYWhjX3VubG9jayhhaGMsICZmbGFncyk7Ci19Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoX19pMzg2X18pCiAvKgogICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbnQKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBhaGNfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQogewogCXVpbnQ4X3QgKmJoOwotI2Vsc2UKLWFoY19saW51eF9iaW9zcGFyYW0oRGlzayAqZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKLXsKLQlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXYgPSBkaXNrLT5kZXZpY2U7Ci0JdV9sb25nCWNhcGFjaXR5ID0gZGlzay0+Y2FwYWNpdHk7Ci0Jc3RydWN0CWJ1ZmZlcl9oZWFkICpiaDsKLSNlbmRpZgogCWludAkgaGVhZHM7CiAJaW50CSBzZWN0b3JzOwogCWludAkgY3lsaW5kZXJzOwpAQCAtMTA5MCwyMiArNzc3LDExIEBACiAJYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CiAJY2hhbm5lbCA9IHNkZXYtPmNoYW5uZWw7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJYmggPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOwotI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykKLQliaCA9IGJyZWFkKE1LREVWKE1BSk9SKGRldiksIE1JTk9SKGRldikgJiB+MHhmKSwgMCwgYmxvY2tfc2l6ZShkZXYpKTsKLSNlbHNlCi0JYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIDEwMjQpOwotI2VuZGlmCi0KIAlpZiAoYmgpIHsKIAkJcmV0ID0gc2NzaV9wYXJ0c2l6ZShiaCwgY2FwYWNpdHksCiAJCQkJICAgICZnZW9tWzJdLCAmZ2VvbVswXSwgJmdlb21bMV0pOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAkJa2ZyZWUoYmgpOwotI2Vsc2UKLQkJYnJlbHNlKGJoKTsKLSNlbmRpZgogCQlpZiAocmV0ICE9IC0xKQogCQkJcmV0dXJuIChyZXQpOwogCX0KQEAgLTExMzUsNyArODExLDcgQEAKICAqIEFib3J0IHRoZSBjdXJyZW50IFNDU0kgY29tbWFuZChzKS4KICAqLwogc3RhdGljIGludAotYWhjX2xpbnV4X2Fib3J0KFNjc2lfQ21uZCAqY21kKQorYWhjX2xpbnV4X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTExNDksNyArODI1LDcgQEAKICAqIEF0dGVtcHQgdG8gc2VuZCBhIHRhcmdldCByZXNldCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgdGhhdCB0aW1lZCBvdXQuCiAgKi8KIHN0YXRpYyBpbnQKLWFoY19saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICpjbWQpCithaGNfbGludXhfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTExNjMsMTggKzgzOSwxNCBAQAogICogUmVzZXQgdGhlIFNDU0kgYnVzLgogICovCiBzdGF0aWMgaW50Ci1haGNfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQorYWhjX2xpbnV4X2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IGFoY19zb2Z0YyAqYWhjOwotCXVfbG9uZyBzOwogCWludCAgICBmb3VuZDsKIAogCWFoYyA9ICooc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGMsICZzKTsKIAlmb3VuZCA9IGFoY19yZXNldF9jaGFubmVsKGFoYywgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCiAJCQkJICAvKmluaXRpYXRlIHJlc2V0Ki9UUlVFKTsKLQlhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYyk7Ci0JYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoYywgJnMpOwogCiAJaWYgKGJvb3R2ZXJib3NlKQogCQlwcmludGYoIiVzOiBTQ1NJIGJ1cyByZXNldCBkZWxpdmVyZWQuICIKQEAgLTExODMsNyArODU1LDcgQEAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAotU2NzaV9Ib3N0X1RlbXBsYXRlIGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlID0geworc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCT0gImFpYzd4eHgiLAogCS5wcm9jX2luZm8JCT0gYWhjX2xpbnV4X3Byb2NfaW5mbywKQEAgLTEyMDYsMzMgKzg3OCw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCi0gKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KLSAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGNfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQotICogZGlyZWN0bHkgYW5kIGFoY19zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KLSAqLwotc3RhdGljIHZvaWQKLWFoY19ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhaGNfc29mdGMqIGFoYzsKLQlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OwotCXVfbG9uZyBmbGFnczsKLQotCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopZGF0YTsKLQlhaGNfbG9jayhhaGMsICZmbGFncyk7Ci0Jd2hpbGUgKChkZXYgPSBhaGNfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoYykpICE9IE5VTEwpIHsKLQkKLQkJVEFJTFFfUkVNT1ZFKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKLQkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9PTl9SVU5fTElTVDsKLQkJYWhjX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGMsIGRldik7Ci0JCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCQlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKLQkJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOwotCX0KLQlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQlVJTERfU0NTSUlEKGFoYywgY21kKQkJCQkJCSAgICBcCiAJKCgoKGNtZCktPmRldmljZS0+aWQgPDwgVElEX1NISUZUKSAmIFRJRCkJCQkgICAgXApAQCAtMTI3OCwzNyArOTIzLDExIEBACiBhaGNfZG1hbWVtX2FsbG9jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lkKiogdmFkZHIsCiAJCSBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKIHsKLQlidXNfZG1hbWFwX3QgbWFwOwotCi0JbWFwID0gbWFsbG9jKHNpemVvZigqbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKLQlpZiAobWFwID09IE5VTEwpCi0JCXJldHVybiAoRU5PTUVNKTsKLQkvKgotCSAqIEFsdGhvdWdoIHdlIGNhbiBkbWEgZGF0YSBhYm92ZSA0R0IsIG91cgotCSAqICJjb25zaXN0ZW50IiBtZW1vcnkgaXMgYmVsb3cgNEdCIGZvcgotCSAqIHNwYWNlIGVmZmljaWVuY3kgcmVhc29ucyAob25seSBuZWVkIGEgNGJ5dGUKLQkgKiBhZGRyZXNzKS4gIEZvciB0aGlzIHJlYXNvbiwgd2UgaGF2ZSB0byByZXNldAotCSAqIG91ciBkbWEgbWFzayB3aGVuIGRvaW5nIGFsbG9jYXRpb25zLgotCSAqLwotCWlmIChhaGMtPmRldl9zb2Z0YyAhPSBOVUxMKQotCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGMtPmRldl9zb2Z0YywgMHhGRkZGRkZGRikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKLQkJCWtmcmVlKG1hcCk7Ci0JCQlyZXR1cm4gKEVOT0RFVik7Ci0JCX0KIAkqdmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywKLQkJCQkgICAgICBkbWF0LT5tYXhzaXplLCAmbWFwLT5idXNfYWRkcik7Ci0JaWYgKGFoYy0+ZGV2X3NvZnRjICE9IE5VTEwpCi0JCWlmIChwY2lfc2V0X2RtYV9tYXNrKGFoYy0+ZGV2X3NvZnRjLAotCQkJCSAgICAgYWhjLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzaykpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKLQkJCWtmcmVlKG1hcCk7Ci0JCQlyZXR1cm4gKEVOT0RFVik7Ci0JCX0KKwkJCQkgICAgICBkbWF0LT5tYXhzaXplLCBtYXBwKTsKIAlpZiAoKnZhZGRyID09IE5VTEwpCi0JCXJldHVybiAoRU5PTUVNKTsKLQkqbWFwcCA9IG1hcDsKLQlyZXR1cm4oMCk7CisJCXJldHVybiBFTk9NRU07CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKQEAgLTEzMTYsNyArOTM1LDcgQEAKIAkJdm9pZCogdmFkZHIsIGJ1c19kbWFtYXBfdCBtYXApCiB7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywgZG1hdC0+bWF4c2l6ZSwKLQkJCSAgICB2YWRkciwgbWFwLT5idXNfYWRkcik7CisJCQkgICAgdmFkZHIsIG1hcCk7CiB9CiAKIGludApAQCAtMTMzMCw3ICs5NDksNyBAQAogCSAqLwogCWJ1c19kbWFfc2VnbWVudF90IHN0YWNrX3NnOwogCi0Jc3RhY2tfc2cuZHNfYWRkciA9IG1hcC0+YnVzX2FkZHI7CisJc3RhY2tfc2cuZHNfYWRkciA9IG1hcDsKIAlzdGFja19zZy5kc19sZW4gPSBkbWF0LT5tYXhzaXplOwogCWNiKGNiX2FyZywgJnN0YWNrX3NnLCAvKm5zZWcqLzEsIC8qZXJyb3IqLzApOwogCXJldHVybiAoMCk7CkBAIC0xMzM5LDEyICs5NTgsNiBAQAogdm9pZAogYWhjX2RtYW1hcF9kZXN0cm95KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQogewotCS8qCi0JICogVGhlIG1hcCBtYXkgaXMgTlVMTCBpbiBvdXIgPCAyLjMuWCBpbXBsZW1lbnRhdGlvbi4KLQkgKiBOb3cgaXQncyAyLjYuNSwgYnV0IGp1c3QgaW4gY2FzZS4uLgotCSAqLwotCUJVR19PTihtYXAgPT0gTlVMTCk7Ci0JZnJlZShtYXAsIE1fREVWQlVGKTsKIH0KIAogaW50CkBAIC0xNTUwLDcgKzExNjMsNyBAQAogdWludDMyX3QgYWljN3h4eF92ZXJib3NlOwogCiBpbnQKLWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK2FoY19saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdGVtcGxhdGUpCiB7CiAJY2hhcgkgYnVmWzgwXTsKIAlzdHJ1Y3QJIFNjc2lfSG9zdCAqaG9zdDsKQEAgLTE1NjQsMTEgKzExNzcsNyBAQAogCiAJKigoc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSkgPSBhaGM7CiAJYWhjX2xvY2soYWhjLCAmcyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKLSNlbGlmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAotCWhvc3QtPmxvY2sgPSAmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2s7Ci0jZW5kaWYKIAlhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OwogCWhvc3QtPmNhbl9xdWV1ZSA9IEFIQ19NQVhfUVVFVUU7CiAJaG9zdC0+Y21kX3Blcl9sdW4gPSAyOwpAQCAtMTU4NywxOSArMTE5NiwxNCBAQAogCQlhaGNfc2V0X25hbWUoYWhjLCBuZXdfbmFtZSk7CiAJfQogCWhvc3QtPnVuaXF1ZV9pZCA9IGFoYy0+dW5pdDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlzY3NpX3NldF9wY2lfZGV2aWNlKGhvc3QsIGFoYy0+ZGV2X3NvZnRjKTsKLSNlbmRpZgogCWFoY19saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKGFoYyk7CiAJYWhjX2ludHJfZW5hYmxlKGFoYywgVFJVRSk7CiAJYWhjX3VubG9jayhhaGMsICZzKTsKIAogCWhvc3QtPnRyYW5zcG9ydHQgPSBhaGNfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXNjc2lfYWRkX2hvc3QoaG9zdCwgKGFoYy0+ZGV2X3NvZnRjID8gJmFoYy0+ZGV2X3NvZnRjLT5kZXYgOiBOVUxMKSk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLwogCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwotI2VuZGlmCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMTcxNywxOSArMTMyMSw5IEBACiAJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gKEVOT01FTSk7CiAJbWVtc2V0KGFoYy0+cGxhdGZvcm1fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSkpOwotCVRBSUxRX0lOSVQoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKTsKLQlUQUlMUV9JTklUKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKTsKIAlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IEFIQ19MSU5VWF9OT0lSUTsKLQlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gMHhGRkZGRkZGRjsKIAlhaGNfbG9ja2luaXQoYWhjKTsKLQlhaGNfZG9uZV9sb2NraW5pdChhaGMpOwotCWluaXRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKLQlhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7Ci0JYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZnVuY3Rpb24gPQotCSAgICAoYWhjX2xpbnV4X2NhbGxiYWNrX3QgKilhaGNfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZTsKIAlpbml0X01VVEVYX0xPQ0tFRCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOwotCXRhc2tsZXRfaW5pdCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5ydW5xX3Rhc2tsZXQsIGFoY19ydW5xX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpYWhjKTsKIAlhaGMtPnNlbHRpbWUgPSAoYWljN3h4eF9zZWx0aW1lICYgMHgzKSA8PCA0OwogCWFoYy0+c2VsdGltZV9iID0gKGFpYzd4eHhfc2VsdGltZSAmIDB4MykgPDwgNDsKIAlpZiAoYWljN3h4eF9wY2lfcGFyaXR5ID09IDApCkBAIC0xNzQ2LDEyICsxMzQwLDggQEAKIAlpbnQgaSwgajsKIAogCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkgewotCQlkZWxfdGltZXJfc3luYygmYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCQl0YXNrbGV0X2tpbGwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKIAkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQkJc2NzaV9yZW1vdmVfaG9zdChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOwotI2VuZGlmCiAJCQlzY3NpX2hvc3RfcHV0KGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CiAJCX0KIApAQCAtMTc4NywxNiArMTM3Nyw3IEBACiAJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhjLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKIAkJCQkJICAgMHgxMDAwKTsKIAkJfQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQkvKgotCQkgKiBJbiAyLjQgd2UgZGV0YWNoIGZyb20gdGhlIHNjc2kgbWlkbGF5ZXIgYmVmb3JlIHRoZSBQQ0kKLQkJICogbGF5ZXIgaW52b2tlcyBvdXIgcmVtb3ZlIGNhbGxiYWNrLiAgTm8gcGVyLWluc3RhbmNlCi0JCSAqIGRldGFjaCBpcyBwcm92aWRlZCwgc28gd2UgbXVzdCByZWFjaCBpbnNpZGUgdGhlIFBDSQotCQkgKiBzdWJzeXN0ZW0ncyBpbnRlcm5hbHMgYW5kIGRldGFjaCBvdXIgZHJpdmVyIG1hbnVhbGx5LgotCQkgKi8KLQkJaWYgKGFoYy0+ZGV2X3NvZnRjICE9IE5VTEwpCi0JCQlhaGMtPmRldl9zb2Z0Yy0+ZHJpdmVyID0gTlVMTDsKLSNlbmRpZgorCiAJCWZyZWUoYWhjLT5wbGF0Zm9ybV9kYXRhLCBNX0RFVkJVRik7CiAJfQogfQpAQCAtMTgyMCw3ICsxNDAxLDcgQEAKIAogCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKIAkJCQkgICBkZXZpbmZvLT50YXJnZXQsCi0JCQkJICAgZGV2aW5mby0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJCQkJICAgZGV2aW5mby0+bHVuKTsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybjsKIAl3YXNfcXVldWluZyA9IGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpOwpAQCAtMTg3Myw3ICsxNDU0LDYgQEAKIAkJZGV2LT5tYXh0YWdzID0gMDsKIAkJZGV2LT5vcGVuaW5ncyA9ICAxIC0gZGV2LT5hY3RpdmU7CiAJfQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAlpZiAoZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMKSB7CiAJCXN3aXRjaCAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpKSkgewogCQljYXNlIEFIQ19ERVZfUV9CQVNJQzoKQEAgLTE4OTksOTAgKzE0NzksMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotI2VuZGlmCiB9CiAKIGludAogYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsCiAJCQlpbnQgbHVuLCB1X2ludCB0YWcsIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpCiB7Ci0JaW50IGNoYW47Ci0JaW50IG1heGNoYW47Ci0JaW50IHRhcmc7Ci0JaW50IG1heHRhcmc7Ci0JaW50IGNsdW47Ci0JaW50IG1heGx1bjsKLQlpbnQgY291bnQ7Ci0KLQlpZiAodGFnICE9IFNDQl9MSVNUX05VTEwpCi0JCXJldHVybiAoMCk7Ci0KLQljaGFuID0gMDsKLQlpZiAoY2hhbm5lbCAhPSBBTExfQ0hBTk5FTFMpIHsKLQkJY2hhbiA9IGNoYW5uZWwgLSAnQSc7Ci0JCW1heGNoYW4gPSBjaGFuICsgMTsKLQl9IGVsc2UgewotCQltYXhjaGFuID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgPyAyIDogMTsKLQl9Ci0JdGFyZyA9IDA7Ci0JaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7Ci0JCXRhcmcgPSB0YXJnZXQ7Ci0JCW1heHRhcmcgPSB0YXJnICsgMTsKLQl9IGVsc2UgewotCQltYXh0YXJnID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPyAxNiA6IDg7Ci0JfQotCWNsdW4gPSAwOwotCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgewotCQljbHVuID0gbHVuOwotCQltYXhsdW4gPSBjbHVuICsgMTsKLQl9IGVsc2UgewotCQltYXhsdW4gPSBBSENfTlVNX0xVTlM7Ci0JfQotCi0JY291bnQgPSAwOwotCWZvciAoOyBjaGFuIDwgbWF4Y2hhbjsgY2hhbisrKSB7Ci0KLQkJZm9yICg7IHRhcmcgPCBtYXh0YXJnOyB0YXJnKyspIHsKLQotCQkJZm9yICg7IGNsdW4gPCBtYXhsdW47IGNsdW4rKykgewotCQkJCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7Ci0JCQkJc3RydWN0IGFoY19idXN5cSAqYnVzeXE7Ci0JCQkJc3RydWN0IGFoY19jbWQgKmFjbWQ7Ci0KLQkJCQlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGNoYW4sCi0JCQkJCQkJICAgdGFyZywgY2x1biwKLQkJCQkJCQkgICAvKmFsbG9jKi9GQUxTRSk7Ci0JCQkJaWYgKGRldiA9PSBOVUxMKQotCQkJCQljb250aW51ZTsKLQotCQkJCWJ1c3lxID0gJmRldi0+YnVzeXE7Ci0JCQkJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoYnVzeXEpKSAhPSBOVUxMKSB7Ci0JCQkJCVNjc2lfQ21uZCAqY21kOwotCi0JCQkJCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOwotCQkJCQlUQUlMUV9SRU1PVkUoYnVzeXEsIGFjbWQsCi0JCQkJCQkgICAgIGFjbWRfbGlua3MudHFlKTsKLQkJCQkJY291bnQrKzsKLQkJCQkJY21kLT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7Ci0JCQkJCWFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhjLCBjbWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAoY291bnQpOwotfQotCi1zdGF0aWMgdm9pZAotYWhjX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQotewotCXVfbG9uZyBmbGFnczsKLQotCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKLQlkZWxfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKLQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSENfUlVOX0NNUExUX1FfVElNRVI7Ci0JYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOwotCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdV9pbnQKQEAgLTIwNDUsMjEzICsxNTQ4LDIwMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLWFoY19saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQKK2FoY19saW51eF9ydW5fY29tbWFuZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlzdHJ1Y3QJIGFoY19jbWQgKmFjbWQ7Ci0Jc3RydWN0CSBzY3NpX2NtbmQgKmNtZDsKIAlzdHJ1Y3QJIHNjYiAqc2NiOwogCXN0cnVjdAkgaGFyZHdhcmVfc2NiICpoc2NiOwogCXN0cnVjdAkgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CiAJc3RydWN0CSBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CiAJdWludDE2X3QgbWFzazsKKwlzdHJ1Y3Qgc2NiX3RhaWxxICp1bnRhZ2dlZF9xID0gTlVMTDsKIAotCWlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfT05fUlVOX0xJU1QpICE9IDApCi0JCXBhbmljKCJydW5uaW5nIGRldmljZSBvbiBydW4gbGlzdCIpOworCS8qCisJICogU2NoZWR1bGUgdXMgdG8gcnVuIGxhdGVyLiAgVGhlIG9ubHkgcmVhc29uIHdlIGFyZSBub3QKKwkgKiBydW5uaW5nIGlzIGJlY2F1c2UgdGhlIHdob2xlIGNvbnRyb2xsZXIgUSBpcyBmcm96ZW4uCisJICovCisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAotCXdoaWxlICgoYWNtZCA9IFRBSUxRX0ZJUlNUKCZkZXYtPmJ1c3lxKSkgIT0gTlVMTAotCSAgICAmJiBkZXYtPm9wZW5pbmdzID4gMCAmJiBkZXYtPnFmcm96ZW4gPT0gMCkgeworCS8qCisJICogV2Ugb25seSBhbGxvdyBvbmUgdW50YWdnZWQgdHJhbnNhY3Rpb24KKwkgKiBwZXIgdGFyZ2V0IGluIHRoZSBpbml0aWF0b3Igcm9sZSB1bmxlc3MKKwkgKiB3ZSBhcmUgc3RvcmluZyBhIGZ1bGwgYnVzeSB0YXJnZXQgKmx1bioKKwkgKiB0YWJsZSBpbiBTQ0Igc3BhY2UuCisJICovCisJaWYgKCFibGtfcnFfdGFnZ2VkKGNtZC0+cmVxdWVzdCkKKwkgICAgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQlpbnQgdGFyZ2V0X29mZnNldDsKIAotCQkvKgotCQkgKiBTY2hlZHVsZSB1cyB0byBydW4gbGF0ZXIuICBUaGUgb25seSByZWFzb24gd2UgYXJlIG5vdAotCQkgKiBydW5uaW5nIGlzIGJlY2F1c2UgdGhlIHdob2xlIGNvbnRyb2xsZXIgUSBpcyBmcm96ZW4uCi0JCSAqLwotCQlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDApIHsKLQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLAotCQkJCQkgIGRldiwgbGlua3MpOwotCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX09OX1JVTl9MSVNUOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qCi0JCSAqIEdldCBhbiBzY2IgdG8gdXNlLgotCQkgKi8KLQkJaWYgKChzY2IgPSBhaGNfZ2V0X3NjYihhaGMpKSA9PSBOVUxMKSB7Ci0JCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwKLQkJCQkJIGRldiwgbGlua3MpOwotCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX09OX1JVTl9MSVNUOwotCQkJYWhjLT5mbGFncyB8PSBBSENfUkVTT1VSQ0VfU0hPUlRBR0U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVEFJTFFfUkVNT1ZFKCZkZXYtPmJ1c3lxLCBhY21kLCBhY21kX2xpbmtzLnRxZSk7Ci0JCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOwotCQlzY2ItPmlvX2N0eCA9IGNtZDsKLQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7Ci0JCWhzY2IgPSBzY2ItPmhzY2I7Ci0JCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopc2NiOwotCi0JCS8qCi0JCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KLQkJICovCi0JCWhzY2ItPmNvbnRyb2wgPSAwOwotCQloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhjLCBjbWQpOwotCQloc2NiLT5sdW4gPSBjbWQtPmRldmljZS0+bHVuOwotCQltYXNrID0gU0NCX0dFVF9UQVJHRVRfTUFTSyhhaGMsIHNjYik7Ci0JCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIFNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYiksCi0JCQkJCSAgICBTQ0JfR0VUX09VUl9JRChzY2IpLAotCQkJCQkgICAgU0NCX0dFVF9UQVJHRVQoYWhjLCBzY2IpLCAmdHN0YXRlKTsKLQkJaHNjYi0+c2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7Ci0JCWhzY2ItPnNjc2lvZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7Ci0JCWlmICgodHN0YXRlLT51bHRyYWVuYiAmIG1hc2spICE9IDApCi0JCQloc2NiLT5jb250cm9sIHw9IFVMVFJBRU5COwotCi0JCWlmICgoYWhjLT51c2VyX2Rpc2NlbmFibGUgJiBtYXNrKSAhPSAwKQotCQkJaHNjYi0+Y29udHJvbCB8PSBESVNDRU5COwotCi0JCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKLQkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOwotCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7Ci0JCX0KLQotCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX1RBR0dFRHxBSENfREVWX1FfQkFTSUMpKSAhPSAwKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQkJaW50CW1zZ19ieXRlczsKLQkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07Ci0KLQkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKLQkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7Ci0JCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKLQkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKLQkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwotCQkJfSBlbHNlCi0jZW5kaWYKLQkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSENfT1RBR19USFJFU0gKLQkJCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9UQUdHRUQpICE9IDApIHsKLQkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7Ci0JCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKLQkJCX0KLQkJfQotCi0JCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47Ci0JCWlmIChoc2NiLT5jZGJfbGVuIDw9IDEyKSB7Ci0JCQltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KGhzY2ItPmNkYjMyLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOwotCQkJc2NiLT5mbGFncyB8PSBTQ0JfQ0RCMzJfUFRSOwotCQl9Ci0KLQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7Ci0JCWFoY19zZXRfcmVzaWR1YWwoc2NiLCAwKTsKLQkJYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOwotCQlzY2ItPnNnX2NvdW50ID0gMDsKLQkJaWYgKGNtZC0+dXNlX3NnICE9IDApIHsKLQkJCXN0cnVjdAlhaGNfZG1hX3NlZyAqc2c7Ci0JCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmN1cl9zZWc7Ci0JCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmVuZF9zZWc7Ci0JCQlpbnQJbnNlZzsKLQotCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOwotCQkJbnNlZyA9IHBjaV9tYXBfc2coYWhjLT5kZXZfc29mdGMsIGN1cl9zZWcsIGNtZC0+dXNlX3NnLAotCQkJICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOwotCQkJZW5kX3NlZyA9IGN1cl9zZWcgKyBuc2VnOwotCQkJLyogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgbGlzdC4gKi8KLQkJCXNnID0gc2NiLT5zZ19saXN0OwotCQkJLyoKLQkJCSAqIFRoZSBzZ19jb3VudCBtYXkgYmUgbGFyZ2VyIHRoYW4gbnNlZyBpZgotCQkJICogYSB0cmFuc2ZlciBjcm9zc2VzIGEgMzJiaXQgcGFnZS4KLQkJCSAqLyAKLQkJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgewotCQkJCWRtYV9hZGRyX3QgYWRkcjsKLQkJCQlidXNfc2l6ZV90IGxlbjsKLQkJCQlpbnQgY29uc3VtZWQ7Ci0KLQkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7Ci0JCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKLQkJCQljb25zdW1lZCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAotCQkJCQkJCSAgICAgc2csIGFkZHIsIGxlbik7Ci0JCQkJc2cgKz0gY29uc3VtZWQ7Ci0JCQkJc2NiLT5zZ19jb3VudCArPSBjb25zdW1lZDsKLQkJCQljdXJfc2VnKys7Ci0JCQl9Ci0JCQlzZy0tOwotCQkJc2ctPmxlbiB8PSBhaGNfaHRvbGUzMihBSENfRE1BX0xBU1RfU0VHKTsKLQotCQkJLyoKLQkJCSAqIFJlc2V0IHRoZSBzZyBsaXN0IHBvaW50ZXIuCi0JCQkgKi8KLQkJCXNjYi0+aHNjYi0+c2dwdHIgPQotCQkJICAgIGFoY19odG9sZTMyKHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRCk7Ci0KLQkJCS8qCi0JCQkgKiBDb3B5IHRoZSBmaXJzdCBTRyBpbnRvIHRoZSAiY3VycmVudCIKLQkJCSAqIGRhdGEgcG9pbnRlciBhcmVhLgotCQkJICovCi0JCQlzY2ItPmhzY2ItPmRhdGFwdHIgPSBzY2ItPnNnX2xpc3QtPmFkZHI7Ci0JCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzY2ItPnNnX2xpc3QtPmxlbjsKLQkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7Ci0JCQlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKLQkJCWRtYV9hZGRyX3QgYWRkcjsKLQotCQkJc2cgPSBzY2ItPnNnX2xpc3Q7Ci0JCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoYWhjLT5kZXZfc29mdGMsCi0JCQkgICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKLQkJCSAgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKLQkJCSAgICAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOwotCQkJc2NiLT5zZ19jb3VudCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAotCQkJCQkJCSAgc2csIGFkZHIsCi0JCQkJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbik7Ci0JCQlzZy0+bGVuIHw9IGFoY19odG9sZTMyKEFIQ19ETUFfTEFTVF9TRUcpOwotCi0JCQkvKgotCQkJICogUmVzZXQgdGhlIHNnIGxpc3QgcG9pbnRlci4KLQkJCSAqLwotCQkJc2NiLT5oc2NiLT5zZ3B0ciA9Ci0JCQkgICAgYWhjX2h0b2xlMzIoc2NiLT5zZ19saXN0X3BoeXMgfCBTR19GVUxMX1JFU0lEKTsKLQotCQkJLyoKLQkJCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IgotCQkJICogZGF0YSBwb2ludGVyIGFyZWEuCi0JCQkgKi8KLQkJCXNjYi0+aHNjYi0+ZGF0YXB0ciA9IHNnLT5hZGRyOwotCQkJc2NiLT5oc2NiLT5kYXRhY250ID0gc2ctPmxlbjsKLQkJfSBlbHNlIHsKLQkJCXNjYi0+aHNjYi0+c2dwdHIgPSBhaGNfaHRvbGUzMihTR19MSVNUX05VTEwpOwotCQkJc2NiLT5oc2NiLT5kYXRhcHRyID0gMDsKLQkJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7Ci0JCQlzY2ItPnNnX2NvdW50ID0gMDsKLQkJfQotCi0JCWFoY19zeW5jX3NnbGlzdChhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFV1JJVEUpOwotCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKLQkJZGV2LT5vcGVuaW5ncy0tOwotCQlkZXYtPmFjdGl2ZSsrOwotCQlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOwotCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX1BFUklPRElDX09UQUcpICE9IDApCi0JCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOwotCi0JCS8qCi0JCSAqIFdlIG9ubHkgYWxsb3cgb25lIHVudGFnZ2VkIHRyYW5zYWN0aW9uCi0JCSAqIHBlciB0YXJnZXQgaW4gdGhlIGluaXRpYXRvciByb2xlIHVubGVzcwotCQkgKiB3ZSBhcmUgc3RvcmluZyBhIGZ1bGwgYnVzeSB0YXJnZXQgKmx1bioKLQkJICogdGFibGUgaW4gU0NCIHNwYWNlLgotCQkgKi8KLQkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiAoVEFSR0VUX1NDQnxUQUdfRU5CKSkgPT0gMAotCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfU0NCX0JUVCkgPT0gMCkgewotCQkJc3RydWN0IHNjYl90YWlscSAqdW50YWdnZWRfcTsKLQkJCWludCB0YXJnZXRfb2Zmc2V0OwotCi0JCQl0YXJnZXRfb2Zmc2V0ID0gU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKTsKLQkJCXVudGFnZ2VkX3EgPSAmKGFoYy0+dW50YWdnZWRfcXVldWVzW3RhcmdldF9vZmZzZXRdKTsKLQkJCVRBSUxRX0lOU0VSVF9UQUlMKHVudGFnZ2VkX3EsIHNjYiwgbGlua3MudHFlKTsKLQkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1VOVEFHR0VEUTsKLQkJCWlmIChUQUlMUV9GSVJTVCh1bnRhZ2dlZF9xKSAhPSBzY2IpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJc2NiLT5mbGFncyB8PSBTQ0JfQUNUSVZFOwotCQlhaGNfcXVldWVfc2NiKGFoYywgc2NiKTsKKwkJdGFyZ2V0X29mZnNldCA9IGNtZC0+ZGV2aWNlLT5pZCArIGNtZC0+ZGV2aWNlLT5jaGFubmVsICogODsKKwkJdW50YWdnZWRfcSA9ICYoYWhjLT51bnRhZ2dlZF9xdWV1ZXNbdGFyZ2V0X29mZnNldF0pOworCQlpZiAoIVRBSUxRX0VNUFRZKHVudGFnZ2VkX3EpKQorCQkJLyogaWYgd2UncmUgYWxyZWFkeSBleGVjdXRpbmcgYW4gdW50YWdnZWQgY29tbWFuZAorCQkJICogd2UncmUgYnVzeSB0byBhbm90aGVyICovCisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCX0KKworCS8qCisJICogR2V0IGFuIHNjYiB0byB1c2UuCisJICovCisJaWYgKChzY2IgPSBhaGNfZ2V0X3NjYihhaGMpKSA9PSBOVUxMKSB7CisJCQlhaGMtPmZsYWdzIHw9IEFIQ19SRVNPVVJDRV9TSE9SVEFHRTsKKwkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCXNjYi0+aW9fY3R4ID0gY21kOworCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2ID0gZGV2OworCWhzY2IgPSBzY2ItPmhzY2I7CisJY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzY2I7CisKKwkvKgorCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KKwkgKi8KKwloc2NiLT5jb250cm9sID0gMDsKKwloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhjLCBjbWQpOworCWhzY2ItPmx1biA9IGNtZC0+ZGV2aWNlLT5sdW47CisJbWFzayA9IFNDQl9HRVRfVEFSR0VUX01BU0soYWhjLCBzY2IpOworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIFNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYiksCisJCQkJICAgIFNDQl9HRVRfT1VSX0lEKHNjYiksCisJCQkJICAgIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwgJnRzdGF0ZSk7CisJaHNjYi0+c2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7CisJaHNjYi0+c2NzaW9mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwlpZiAoKHRzdGF0ZS0+dWx0cmFlbmIgJiBtYXNrKSAhPSAwKQorCQloc2NiLT5jb250cm9sIHw9IFVMVFJBRU5COworCQorCWlmICgoYWhjLT51c2VyX2Rpc2NlbmFibGUgJiBtYXNrKSAhPSAwKQorCQloc2NiLT5jb250cm9sIHw9IERJU0NFTkI7CisJCisJaWYgKCh0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICYgbWFzaykgIT0gMCkgeworCQlzY2ItPmZsYWdzIHw9IFNDQl9BVVRPX05FR09USUFURTsKKwkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgKEFIQ19ERVZfUV9UQUdHRUR8QUhDX0RFVl9RX0JBU0lDKSkgIT0gMCkgeworCQlpbnQJbXNnX2J5dGVzOworCQl1aW50OF90IHRhZ19tc2dzWzJdOworCQkKKwkJbXNnX2J5dGVzID0gc2NzaV9wb3B1bGF0ZV90YWdfbXNnKGNtZCwgdGFnX21zZ3MpOworCQlpZiAobXNnX2J5dGVzICYmIHRhZ19tc2dzWzBdICE9IE1TR19TSU1QTEVfVEFTSykgeworCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCWlmICh0YWdfbXNnc1swXSA9PSBNU0dfT1JERVJFRF9UQVNLKQorCQkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKwkJfSBlbHNlIGlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSENfT1RBR19USFJFU0gKKwkJCQkmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTVNHX09SREVSRURfVEFTSzsKKwkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKwkJfSBlbHNlIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTVNHX1NJTVBMRV9UQVNLOworCQl9CisJfQorCisJaHNjYi0+Y2RiX2xlbiA9IGNtZC0+Y21kX2xlbjsKKwlpZiAoaHNjYi0+Y2RiX2xlbiA8PSAxMikgeworCQltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCX0gZWxzZSB7CisJCW1lbWNweShoc2NiLT5jZGIzMiwgY21kLT5jbW5kLCBoc2NiLT5jZGJfbGVuKTsKKwkJc2NiLT5mbGFncyB8PSBTQ0JfQ0RCMzJfUFRSOworCX0KKworCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gPSAwOworCWFoY19zZXRfcmVzaWR1YWwoc2NiLCAwKTsKKwlhaGNfc2V0X3NlbnNlX3Jlc2lkdWFsKHNjYiwgMCk7CisJc2NiLT5zZ19jb3VudCA9IDA7CisJaWYgKGNtZC0+dXNlX3NnICE9IDApIHsKKwkJc3RydWN0CWFoY19kbWFfc2VnICpzZzsKKwkJc3RydWN0CXNjYXR0ZXJsaXN0ICpjdXJfc2VnOworCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmVuZF9zZWc7CisJCWludAluc2VnOworCisJCWN1cl9zZWcgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJbnNlZyA9IHBjaV9tYXBfc2coYWhjLT5kZXZfc29mdGMsIGN1cl9zZWcsIGNtZC0+dXNlX3NnLAorCQkJCSAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWVuZF9zZWcgPSBjdXJfc2VnICsgbnNlZzsKKwkJLyogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgbGlzdC4gKi8KKwkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCS8qCisJCSAqIFRoZSBzZ19jb3VudCBtYXkgYmUgbGFyZ2VyIHRoYW4gbnNlZyBpZgorCQkgKiBhIHRyYW5zZmVyIGNyb3NzZXMgYSAzMmJpdCBwYWdlLgorCQkgKi8gCisJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgeworCQkJZG1hX2FkZHJfdCBhZGRyOworCQkJYnVzX3NpemVfdCBsZW47CisJCQlpbnQgY29uc3VtZWQ7CisKKwkJCWFkZHIgPSBzZ19kbWFfYWRkcmVzcyhjdXJfc2VnKTsKKwkJCWxlbiA9IHNnX2RtYV9sZW4oY3VyX3NlZyk7CisJCQljb25zdW1lZCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAorCQkJCQkJICAgICBzZywgYWRkciwgbGVuKTsKKwkJCXNnICs9IGNvbnN1bWVkOworCQkJc2NiLT5zZ19jb3VudCArPSBjb25zdW1lZDsKKwkJCWN1cl9zZWcrKzsKKwkJfQorCQlzZy0tOworCQlzZy0+bGVuIHw9IGFoY19odG9sZTMyKEFIQ19ETUFfTEFTVF9TRUcpOworCisJCS8qCisJCSAqIFJlc2V0IHRoZSBzZyBsaXN0IHBvaW50ZXIuCisJCSAqLworCQlzY2ItPmhzY2ItPnNncHRyID0KKwkJCWFoY19odG9sZTMyKHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRCk7CisJCQorCQkvKgorCQkgKiBDb3B5IHRoZSBmaXJzdCBTRyBpbnRvIHRoZSAiY3VycmVudCIKKwkJICogZGF0YSBwb2ludGVyIGFyZWEuCisJCSAqLworCQlzY2ItPmhzY2ItPmRhdGFwdHIgPSBzY2ItPnNnX2xpc3QtPmFkZHI7CisJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNjYi0+c2dfbGlzdC0+bGVuOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKKwkJZG1hX2FkZHJfdCBhZGRyOworCisJCXNnID0gc2NiLT5zZ19saXN0OworCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoYWhjLT5kZXZfc29mdGMsCisJCQkJICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5idWZfYnVzYWRkciA9IGFkZHI7CisJCXNjYi0+c2dfY291bnQgPSBhaGNfbGludXhfbWFwX3NlZyhhaGMsIHNjYiwKKwkJCQkJCSAgc2csIGFkZHIsCisJCQkJCQkgIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJc2ctPmxlbiB8PSBhaGNfaHRvbGUzMihBSENfRE1BX0xBU1RfU0VHKTsKKworCQkvKgorCQkgKiBSZXNldCB0aGUgc2cgbGlzdCBwb2ludGVyLgorCQkgKi8KKwkJc2NiLT5oc2NiLT5zZ3B0ciA9CisJCQlhaGNfaHRvbGUzMihzY2ItPnNnX2xpc3RfcGh5cyB8IFNHX0ZVTExfUkVTSUQpOworCisJCS8qCisJCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IgorCQkgKiBkYXRhIHBvaW50ZXIgYXJlYS4KKwkJICovCisJCXNjYi0+aHNjYi0+ZGF0YXB0ciA9IHNnLT5hZGRyOworCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzZy0+bGVuOworCX0gZWxzZSB7CisJCXNjYi0+aHNjYi0+c2dwdHIgPSBhaGNfaHRvbGUzMihTR19MSVNUX05VTEwpOworCQlzY2ItPmhzY2ItPmRhdGFwdHIgPSAwOworCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSAwOworCQlzY2ItPnNnX2NvdW50ID0gMDsKKwl9CisKKwlMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwlkZXYtPm9wZW5pbmdzLS07CisJZGV2LT5hY3RpdmUrKzsKKwlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOworCWlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfUEVSSU9ESUNfT1RBRykgIT0gMCkKKwkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcrKzsKKwkKKwlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJaWYgKHVudGFnZ2VkX3EpIHsKKwkJVEFJTFFfSU5TRVJUX1RBSUwodW50YWdnZWRfcSwgc2NiLCBsaW5rcy50cWUpOworCQlzY2ItPmZsYWdzIHw9IFNDQl9VTlRBR0dFRFE7CisJfQorCWFoY19xdWV1ZV9zY2IoYWhjLCBzY2IpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjI2Nyw5ICsxNzU3LDYgQEAKIAlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKSBkZXZfaWQ7CiAJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOyAKIAlvdXJzID0gYWhjX2ludHIoYWhjKTsKLQlpZiAoYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpICE9IE5VTEwpCi0JCWFoY19zY2hlZHVsZV9ydW5xKGFoYyk7Ci0JYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOwogCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOwogCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOwogfQpAQCAtMjI3OCw4ICsxNzY1LDYgQEAKIGFoY19wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQogewogCi0Jd2hpbGUgKGFoY19saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhjKSAhPSBOVUxMKQotCQk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCoKQEAgLTIzNDgsOSArMTgzMyw2IEBACiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7Ci0JaW5pdF90aW1lcigmZGV2LT50aW1lcik7Ci0JVEFJTFFfSU5JVCgmZGV2LT5idXN5cSk7Ci0JZGV2LT5mbGFncyA9IEFIQ19ERVZfVU5DT05GSUdVUkVEOwogCWRldi0+bHVuID0gbHVuOwogCWRldi0+dGFyZ2V0ID0gdGFyZzsKIApAQCAtMjM3Myw3ICsxODU1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLV9fYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldikKK2FoY19saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmc7CiAKQEAgLTIzODUsMTMgKzE4NjcsNiBAQAogCQlhaGNfbGludXhfZnJlZV90YXJnZXQoYWhjLCB0YXJnKTsKIH0KIAotc3RhdGljIHZvaWQKLWFoY19saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCi17Ci0JZGVsX3RpbWVyX3N5bmMoJmRldi0+dGltZXIpOwotCV9fYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKGFoYywgZGV2KTsKLX0KLQogdm9pZAogYWhjX3NlbmRfYXN5bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyIGNoYW5uZWwsCiAJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlIGNvZGUsIHZvaWQgKmFyZykKQEAgLTI0NjMsMjggKzE5MzgsOSBAQAogCX0KICAgICAgICAgY2FzZSBBQ19TRU5UX0JEUjoKIAl7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQlXQVJOX09OKGx1biAhPSBDQU1fTFVOX1dJTERDQVJEKTsKIAkJc2NzaV9yZXBvcnRfZGV2aWNlX3Jlc2V0KGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKIAkJCQkJIGNoYW5uZWwgLSAnQScsIHRhcmdldCk7Ci0jZWxzZQotCQlTY3NpX0RldmljZSAqc2NzaV9kZXY7Ci0KLQkJLyoKLQkJICogRmluZCB0aGUgU0NTSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkJICogcmVxdWVzdCBhbmQgaW5kaWNhdGUgdGhhdCBhIFVBIGlzIGV4cGVjdGVkLgotCQkgKi8KLQkJZm9yIChzY3NpX2RldiA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdC0+aG9zdF9xdWV1ZTsKLQkJICAgICBzY3NpX2RldiAhPSBOVUxMOyBzY3NpX2RldiA9IHNjc2lfZGV2LT5uZXh0KSB7Ci0JCQlpZiAoY2hhbm5lbCAtICdBJyA9PSBzY3NpX2Rldi0+Y2hhbm5lbAotCQkJICYmIHRhcmdldCA9PSBzY3NpX2Rldi0+aWQKLQkJCSAmJiAobHVuID09IENBTV9MVU5fV0lMRENBUkQKLQkJCSAgfHwgbHVuID09IHNjc2lfZGV2LT5sdW4pKSB7Ci0JCQkJc2NzaV9kZXYtPndhc19yZXNldCA9IDE7Ci0JCQkJc2NzaV9kZXYtPmV4cGVjdGluZ19jY191YSA9IDE7Ci0JCQl9Ci0JCX0KLSNlbmRpZgogCQlicmVhazsKIAl9CiAgICAgICAgIGNhc2UgQUNfQlVTX1JFU0VUOgpAQCAtMjUwNCw3ICsxOTYwLDcgQEAKIHZvaWQKIGFoY19kb25lKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQogewotCVNjc2lfQ21uZCAqY21kOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlzdHJ1Y3QJICAgYWhjX2xpbnV4X2RldmljZSAqZGV2OwogCiAJTElTVF9SRU1PVkUoc2NiLCBwZW5kaW5nX2xpbmtzKTsKQEAgLTI1MTUsNyArMTk3MSw3IEBACiAJCXRhcmdldF9vZmZzZXQgPSBTQ0JfR0VUX1RBUkdFVF9PRkZTRVQoYWhjLCBzY2IpOwogCQl1bnRhZ2dlZF9xID0gJihhaGMtPnVudGFnZ2VkX3F1ZXVlc1t0YXJnZXRfb2Zmc2V0XSk7CiAJCVRBSUxRX1JFTU9WRSh1bnRhZ2dlZF9xLCBzY2IsIGxpbmtzLnRxZSk7Ci0JCWFoY19ydW5fdW50YWdnZWRfcXVldWUoYWhjLCB1bnRhZ2dlZF9xKTsKKwkJQlVHX09OKCFUQUlMUV9FTVBUWSh1bnRhZ2dlZF9xKSk7CiAJfQogCiAJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgewpAQCAtMjU4Myw4ICsyMDM5LDYgQEAKIAkJfQogCX0gZWxzZSBpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0NTSV9TVEFUVVNfRVJST1IpIHsKIAkJYWhjX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhhaGMsIGRldiwgc2NiKTsKLQl9IGVsc2UgaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1NFTF9USU1FT1VUKSB7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9VTkNPTkZJR1VSRUQ7CiAJfQogCiAJaWYgKGRldi0+b3BlbmluZ3MgPT0gMQpAQCAtMjYwNiwxNiArMjA2MCw2IEBACiAJaWYgKGRldi0+YWN0aXZlID09IDApCiAJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKIAotCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkpIHsKLQkJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9VTkNPTkZJR1VSRUQpICE9IDAKLQkJICYmIGRldi0+YWN0aXZlID09IDAKLQkgCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfVElNRVJfQUNUSVZFKSA9PSAwKQotCQkJYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKGFoYywgZGV2KTsKLQl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgewotCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKLQl9Ci0KIAlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKSAhPSAwKSB7CiAJCXByaW50ZigiUmVjb3ZlcnkgU0NCIGNvbXBsZXRlc1xuIik7CiAJCWlmIChhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9CRFJfU0VOVApAQCAtMjY1OSw3ICsyMTAzLDcgQEAKIAljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CiAJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKIAl7Ci0JCVNjc2lfQ21uZCAqY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKIAkJLyoKIAkJICogQ29weSBzZW5zZSBpbmZvcm1hdGlvbiB0byB0aGUgT1MncyBjbWQKQEAgLTI3NTQsNTIgKzIxOTgsMTUgQEAKIAkJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgJmRldmluZm8sCiAJCQkgICAgIChkZXYtPmZsYWdzICYgQUhDX0RFVl9RX0JBU0lDKQogCQkJICAgPyBBSENfUVVFVUVfQkFTSUMgOiBBSENfUVVFVUVfVEFHR0VEKTsKLQkJLyogRkFMTFRIUk9VR0ggKi8KLQl9Ci0JY2FzZSBTQ1NJX1NUQVRVU19CVVNZOgotCXsKLQkJLyoKLQkJICogU2V0IGEgc2hvcnQgdGltZXIgdG8gZGVmZXIgc2VuZGluZyBjb21tYW5kcyBmb3IKLQkJICogYSBiaXQgc2luY2UgTGludXggd2lsbCBub3QgZGVsYXkgaW4gdGhpcyBjYXNlLgotCQkgKi8KLQkJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9USU1FUl9BQ1RJVkUpICE9IDApIHsKLQkJCXByaW50ZigiJXM6JWM6JWQ6IERldmljZSBUaW1lciBzdGlsbCBhY3RpdmUgZHVyaW5nICIKLQkJCSAgICAgICAiYnVzeSBwcm9jZXNzaW5nXG4iLCBhaGNfbmFtZShhaGMpLAotCQkJCWRldi0+dGFyZ2V0LT5jaGFubmVsLCBkZXYtPnRhcmdldC0+dGFyZ2V0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9USU1FUl9BQ1RJVkU7Ci0JCWRldi0+cWZyb3plbisrOwotCQlpbml0X3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJZGV2LT50aW1lci5kYXRhID0gKHVfbG9uZylkZXY7Ci0JCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFovMik7Ci0JCWRldi0+dGltZXIuZnVuY3Rpb24gPSBhaGNfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplOwotCQlhZGRfdGltZXIoJmRldi0+dGltZXIpOwogCQlicmVhazsKIAl9CiAJfQogfQogCiBzdGF0aWMgdm9pZAotYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIFNjc2lfQ21uZCAqY21kKQorYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAkvKgotCSAqIFR5cGljYWxseSwgdGhlIGNvbXBsZXRlIHF1ZXVlIGhhcyB2ZXJ5IGZldyBlbnRyaWVzCi0JICogcXVldWVkIHRvIGl0IGJlZm9yZSB0aGUgcXVldWUgaXMgZW1wdGllZCBieQotCSAqIGFoY19saW51eF9ydW5fY29tcGxldGVfcXVldWUsIHNvIHNvcnRpbmcgdGhlIGVudHJpZXMKLQkgKiBieSBnZW5lcmF0aW9uIG51bWJlciBzaG91bGQgYmUgaW5leHBlbnNpdmUuCi0JICogV2UgcGVyZm9ybSB0aGUgc29ydCBzbyB0aGF0IGNvbW1hbmRzIHRoYXQgY29tcGxldGUKLQkgKiB3aXRoIGFuIGVycm9yIGFyZSByZXR1bmVkIGluIHRoZSBvcmRlciBvcmlnaW9uYWxseQotCSAqIHF1ZXVlZCB0byB0aGUgY29udHJvbGxlciBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IHJldHJpZXMKLQkgKiBhcmUgcGVyZm9ybWVkIGluIG9yZGVyLiAgVGhlIHVuZGVybHlpbmcgYWhjIHJvdXRpbmVzIGRvCi0JICogbm90IGd1YXJhbnRlZSB0aGUgb3JkZXIgdGhhdCBhYm9ydGVkIGNvbW1hbmRzIHdpbGwgYmUKLQkgKiByZXR1cm5lZCB0byB1cy4KLQkgKi8KLQlzdHJ1Y3QgYWhjX2NvbXBsZXRlcSAqY29tcGxldGVxOwotCXN0cnVjdCBhaGNfY21kICpsaXN0X2NtZDsKLQlzdHJ1Y3QgYWhjX2NtZCAqYWNtZDsKLQotCS8qCiAJICogTWFwIENBTSBlcnJvciBjb2RlcyBpbnRvIExpbnV4IEVycm9yIGNvZGVzLiAgV2UKIAkgKiBhdm9pZCB0aGUgY29udmVyc2lvbiBzbyB0aGF0IHRoZSBEViBjb2RlIGhhcyB0aGUKIAkgKiBmdWxsIGVycm9yIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB3aGVuIG1ha2luZwpAQCAtMjg1MiwyNiArMjI1OSw3IEBACiAJCQluZXdfc3RhdHVzID0gRElEX0VSUk9SOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0FNX1JFUVVFVUVfUkVROgotCQkJLyoKLQkJCSAqIElmIHdlIHdhbnQgdGhlIHJlcXVlc3QgcmVxdWV1ZWQsIG1ha2Ugc3VyZSB0aGVyZQotCQkJICogYXJlIHN1ZmZpY2VudCByZXRyaWVzLiAgSW4gdGhlIG9sZCBzY3NpIGVycm9yIGNvZGUsCi0JCQkgKiB3ZSB1c2VkIHRvIGJlIGFibGUgdG8gc3BlY2lmeSBhIHJlc3VsdCBjb2RlIHRoYXQKLQkJCSAqIGJ5cGFzc2VkIHRoZSByZXRyeSBjb3VudC4gIE5vdyB3ZSBtdXN0IHVzZSB0aGlzCi0JCQkgKiBoYWNrLiAgV2UgYWxzbyAiZmFrZSIgYSBjaGVjayBjb25kaXRpb24gd2l0aAotCQkJICogYSBzZW5zZSBjb2RlIG9mIEFCT1JURUQgQ09NTUFORC4gIFRoaXMgc2VlbXMgdG8KLQkJCSAqIGV2b2tlIGEgcmV0cnkgZXZlbiBpZiB0aGlzIGNvbW1hbmQgaXMgYmVpbmcgc2VudAotCQkJICogdmlhIHRoZSBlaCB0aHJlYWQuICBJY2shICBJY2shICBJY2shCi0JCQkgKi8KLQkJCWlmIChjbWQtPnJldHJpZXMgPiAwKQotCQkJCWNtZC0+cmV0cmllcy0tOwotCQkJbmV3X3N0YXR1cyA9IERJRF9PSzsKLQkJCWFoY19jbWRfc2V0X3Njc2lfc3RhdHVzKGNtZCwgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORCk7Ci0JCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKLQkJCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwKLQkJCSAgICAgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKLQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gU1NEX0VSUkNPREVfVkFMSUQKLQkJCQkJICAgICB8IFNTRF9DVVJSRU5UX0VSUk9SOwotCQkJY21kLT5zZW5zZV9idWZmZXJbMl0gPSBTU0RfS0VZX0FCT1JURURfQ09NTUFORDsKKwkJCW5ld19zdGF0dXMgPSBESURfUkVRVUVVRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCkBAIC0yODgyLDE3ICsyMjcwLDcgQEAKIAkJYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgbmV3X3N0YXR1cyk7CiAJfQogCi0JY29tcGxldGVxID0gJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxOwotCWxpc3RfY21kID0gVEFJTFFfRklSU1QoY29tcGxldGVxKTsKLQlhY21kID0gKHN0cnVjdCBhaGNfY21kICopY21kOwotCXdoaWxlIChsaXN0X2NtZCAhPSBOVUxMCi0JICAgICYmIGFjbWRfc2NzaV9jbWQobGlzdF9jbWQpLnNlcmlhbF9udW1iZXIKLQkgICAgIDwgYWNtZF9zY3NpX2NtZChhY21kKS5zZXJpYWxfbnVtYmVyKQotCQlsaXN0X2NtZCA9IFRBSUxRX05FWFQobGlzdF9jbWQsIGFjbWRfbGlua3MudHFlKTsKLQlpZiAobGlzdF9jbWQgIT0gTlVMTCkKLQkJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0X2NtZCwgYWNtZCwgYWNtZF9saW5rcy50cWUpOwotCWVsc2UKLQkJVEFJTFFfSU5TRVJUX1RBSUwoY29tcGxldGVxLCBhY21kLCBhY21kX2xpbmtzLnRxZSk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI5NDAsNyArMjMxOCw2IEBACiAJCWFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbi0tOwogCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMCkKIAkJdW5ibG9ja19yZXFzID0gMTsKLQlhaGNfc2NoZWR1bGVfcnVucShhaGMpOwogCWFoY191bmxvY2soYWhjLCAmcyk7CiAJLyoKIAkgKiBUaGVyZSBpcyBzdGlsbCBhIHJhY2UgaGVyZS4gIFRoZSBtaWQtbGF5ZXIKQEAgLTI5NTIsMzcgKzIzMjksMTIgQEAKIAkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1haGNfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7Ci0JdV9sb25nIHM7Ci0KLQlkZXYgPSAoc3RydWN0IGFoY19saW51eF9kZXZpY2UgKilhcmc7Ci0JYWhjID0gZGV2LT50YXJnZXQtPmFoYzsKLQlhaGNfbG9jayhhaGMsICZzKTsKLQlkZXYtPmZsYWdzICY9IH5BSENfREVWX1RJTUVSX0FDVElWRTsKLQlpZiAoZGV2LT5xZnJvemVuID4gMCkKLQkJZGV2LT5xZnJvemVuLS07Ci0JaWYgKGRldi0+cWZyb3plbiA9PSAwCi0JICYmIChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkKLQkJYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoYWhjLCBkZXYpOwotCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkKLQkgJiYgZGV2LT5hY3RpdmUgPT0gMCkKLQkJX19haGNfbGludXhfZnJlZV9kZXZpY2UoYWhjLCBkZXYpOwotCWFoY191bmxvY2soYWhjLCAmcyk7Ci19Ci0KIHN0YXRpYyBpbnQKLWFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoU2NzaV9DbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpCithaGNfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc2NiX2ZsYWcgZmxhZykKIHsKIAlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7Ci0Jc3RydWN0IGFoY19jbWQgKmFjbWQ7Ci0Jc3RydWN0IGFoY19jbWQgKmxpc3RfYWNtZDsKIAlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OwogCXN0cnVjdCBzY2IgKnBlbmRpbmdfc2NiOwotCXVfbG9uZyBzOwogCXVfaW50ICBzYXZlZF9zY2JwdHI7CiAJdV9pbnQgIGFjdGl2ZV9zY2JfaW5kZXg7CiAJdV9pbnQgIGxhc3RfcGhhc2U7CkBAIC0yOTk4LDcgKzIzNTAsNiBAQAogCXBhdXNlZCA9IEZBTFNFOwogCXdhaXQgPSBGQUxTRTsKIAlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCWFjbWQgPSAoc3RydWN0IGFoY19jbWQgKiljbWQ7CiAKIAlwcmludGYoIiVzOiVkOiVkOiVkOiBBdHRlbXB0aW5nIHRvIHF1ZXVlIGElcyBtZXNzYWdlXG4iLAogCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKQEAgLTMwMTEsMjIgKzIzNjIsNiBAQAogCXByaW50ZigiXG4iKTsKIAogCS8qCi0JICogSW4gYWxsIHZlcnNpb25zIG9mIExpbnV4LCB3ZSBoYXZlIHRvIHdvcmsgYXJvdW5kCi0JICogYSBtYWpvciBmbGF3IGluIGhvdyB0aGUgbWlkLWxheWVyIGlzIGxvY2tlZCBkb3duCi0JICogaWYgd2UgYXJlIHRvIHNsZWVwIHN1Y2Nlc3NmdWxseSBpbiBvdXIgZXJyb3IgaGFuZGxlcgotCSAqIHdoaWxlIGFsbG93aW5nIG91ciBpbnRlcnJ1cHQgaGFuZGxlciB0byBydW4uICBTaW5jZQotCSAqIHRoZSBtaWRsYXllciBhY3F1aXJlcyBlaXRoZXIgdGhlIGlvX3JlcXVlc3RfbG9jayBvcgotCSAqIG91ciBsb2NrIHByaW9yIHRvIGNhbGxpbmcgdXMsIHdlIG11c3QgdXNlIHRoZQotCSAqIHNwaW5fdW5sb2NrX2lycSgpIG1ldGhvZCBmb3IgdW5sb2NraW5nIG91ciBsb2NrLgotCSAqIFRoaXMgd2lsbCBmb3JjZSBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgb24gdGhlCi0JICogY3VycmVudCBDUFUuICBTaW5jZSB0aGUgRUggdGhyZWFkIHNob3VsZCBub3QgaGF2ZQotCSAqIGJlZW4gcnVubmluZyB3aXRoIENQVSBpbnRlcnJ1cHRzIGRpc2FibGVkIG90aGVyIHRoYW4KLQkgKiBieSBhY3F1aXJpbmcgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3Igb3VyIG93bgotCSAqIGxvY2ssIHRoaXMgKnNob3VsZCogYmUgc2FmZS4KLQkgKi8KLQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoYywgJnMpOwotCi0JLyoKIAkgKiBGaXJzdCBkZXRlcm1pbmUgaWYgd2UgY3VycmVudGx5IG93biB0aGlzIGNvbW1hbmQuCiAJICogU3RhcnQgYnkgc2VhcmNoaW5nIHRoZSBkZXZpY2UgcXVldWUuICBJZiBub3QgZm91bmQKIAkgKiB0aGVyZSwgY2hlY2sgdGhlIHBlbmRpbmdfc2NiIGxpc3QuICBJZiBub3QgZm91bmQKQEAgLTMwMzQsNyArMjM2OSw3IEBACiAJICogY29tbWFuZCwgcmV0dXJuIHN1Y2Nlc3MuCiAJICovCiAJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAotCQkJCSAgIGNtZC0+ZGV2aWNlLT5sdW4sIC8qYWxsb2MqL0ZBTFNFKTsKKwkJCQkgICBjbWQtPmRldmljZS0+bHVuKTsKIAogCWlmIChkZXYgPT0gTlVMTCkgewogCQkvKgpAQCAtMzA0OCwyNCArMjM4Myw2IEBACiAJCWdvdG8gbm9fY21kOwogCX0KIAotCVRBSUxRX0ZPUkVBQ0gobGlzdF9hY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKLQkJaWYgKGxpc3RfYWNtZCA9PSBhY21kKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGxpc3RfYWNtZCAhPSBOVUxMKSB7Ci0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gZGV2aWNlIHF1ZXVlXG4iLAotCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOwotCQlpZiAoZmxhZyA9PSBTQ0JfQUJPUlQpIHsKLQkJCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgbGlzdF9hY21kLCBhY21kX2xpbmtzLnRxZSk7Ci0JCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQkJCWFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhjLCBjbWQpOwotCQkJcmV0dmFsID0gU1VDQ0VTUzsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQogCWlmICgoZGV2LT5mbGFncyAmIChBSENfREVWX1FfQkFTSUN8QUhDX0RFVl9RX1RBR0dFRCkpID09IDAKIAkgJiYgYWhjX3NlYXJjaF91bnRhZ2dlZF9xdWV1ZXMoYWhjLCBjbWQsIGNtZC0+ZGV2aWNlLT5pZCwKIAkJCQkgICAgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCkBAIC0zMjk5LDUzICsyNjE2LDQyIEBACiAJCX0KIAkJc3Bpbl9sb2NrX2lycSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwogCX0KLQlhaGNfc2NoZWR1bGVfcnVucShhaGMpOwotCWFoY19saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhjKTsKLQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmcyk7CiAJcmV0dXJuIChyZXR2YWwpOwogfQogCiB2b2lkCiBhaGNfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKIHsKLQlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OwotCWludCBjaGFubmVsOwotCWludCBtYXhjaGFubmVsOwotCWludCB0YXJnZXQ7Ci0JaW50IG1heHRhcmdldDsKLQlpbnQgbHVuOwotCWludCBpOwotCi0JbWF4Y2hhbm5lbCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pID8gMSA6IDA7Ci0JbWF4dGFyZ2V0ID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPyAxNSA6IDc7Ci0JZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBtYXhjaGFubmVsOyBjaGFubmVsKyspIHsKLQotCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PW1heHRhcmdldDsgdGFyZ2V0KyspIHsKLQotCQkJZm9yIChsdW4gPSAwOyBsdW4gPCBBSENfTlVNX0xVTlM7IGx1bisrKSB7Ci0JCQkJc3RydWN0IGFoY19jbWQgKmFjbWQ7Ci0KLQkJCQlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGNoYW5uZWwsIHRhcmdldCwKLQkJCQkJCQkgICBsdW4sIC8qYWxsb2MqL0ZBTFNFKTsKLQkJCQlpZiAoZGV2ID09IE5VTEwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcHJpbnRmKCJEZXZRKCVkOiVkOiVkKTogIiwKLQkJCQkgICAgICAgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOwotCQkJCWkgPSAwOwotCQkJCVRBSUxRX0ZPUkVBQ0goYWNtZCwgJmRldi0+YnVzeXEsCi0JCQkJCSAgICAgIGFjbWRfbGlua3MudHFlKSB7Ci0JCQkJCWlmIChpKysgPiBBSENfU0NCX01BWCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwcmludGYoIiVkIHdhaXRpbmdcbiIsIGkpOwotCQkJfQotCQl9Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBhaGNfbGludXhfZXhpdCh2b2lkKTsKIAorc3RhdGljIHZvaWQgYWhjX2xpbnV4X2dldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzcGlfd2lkdGgoc3RhcmdldCkgPSB0aW5mby0+Y3Vyci53aWR0aDsKK30KKworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3NldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3aWR0aCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCWFoY19zZXRfd2lkdGgoYWhjLCAmZGV2aW5mbywgd2lkdGgsIEFIQ19UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhjX3VubG9jayhhaGMsICZmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIGFoY19saW51eF9nZXRfcGVyaW9kKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKQEAgLTMzNzYsOCArMjY4MiwyMSBAQAogCWlmIChvZmZzZXQgPT0gMCkKIAkJb2Zmc2V0ID0gTUFYX09GRlNFVDsKIAorCWlmIChwZXJpb2QgPCA5KQorCQlwZXJpb2QgPSA5OwkvKiAxMi41bnMgaXMgb3VyIG1pbmltdW0gKi8KKwlpZiAocGVyaW9kID09IDkpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0RUX1JFUTsKKwogCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKIAkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisKKwkvKiBhbGwgUFBSIHJlcXVlc3RzIGFwYXJ0IGZyb20gUUFTIHJlcXVpcmUgd2lkZSB0cmFuc2ZlcnMgKi8KKwlpZiAocHByX29wdGlvbnMgJiB+TVNHX0VYVF9QUFJfUUFTX1JFUSkgeworCQlhaGNfbGludXhfZ2V0X3dpZHRoKHN0YXJnZXQpOworCQlpZiAoc3BpX3dpZHRoKHN0YXJnZXQpID09IDApCisJCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCX0KKwogCXN5bmNyYXRlID0gYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsIEFIQ19TWU5DUkFURV9EVCk7CiAJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOwogCWFoY19zZXRfc3luY3JhdGUoYWhjLCAmZGV2aW5mbywgc3luY3JhdGUsIHBlcmlvZCwgb2Zmc2V0LApAQCAtMzQyNSwzMiArMjc0NCw2IEBACiAJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY19saW51eF9nZXRfd2lkdGgoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQotewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBhaGNfc29mdGMgKmFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKLQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKLQkJPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywKLQkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAotCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7Ci0Jc3BpX3dpZHRoKHN0YXJnZXQpID0gdGluZm8tPmN1cnIud2lkdGg7Ci19Ci0KLXN0YXRpYyB2b2lkIGFoY19saW51eF9zZXRfd2lkdGgoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgd2lkdGgpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IGFoY19zb2Z0YyAqYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOwotCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCi0JCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOwotCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKLQlhaGNfc2V0X3dpZHRoKGFoYywgJmRldmluZm8sIHdpZHRoLCBBSENfVFJBTlNfR09BTCwgRkFMU0UpOwotCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBhaGNfbGludXhfZ2V0X2R0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKQEAgLTM0NzksMTAgKzI3NzIsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlOwogCisJaWYgKGR0KSB7CisJCXBlcmlvZCA9IDk7CS8qIDEyLjVucyBpcyB0aGUgb25seSBwZXJpb2QgdmFsaWQgZm9yIERUICovCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0RUX1JFUTsKKwl9IGVsc2UgaWYgKHBlcmlvZCA9PSA5KQorCQlwZXJpb2QgPSAxMDsJLyogaWYgcmVzZXR0aW5nIERULCBwZXJpb2QgbXVzdCBiZSA+PSAyNW5zICovCisKIAlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCiAJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOwotCXN5bmNyYXRlID0gYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCi0JCQkJICAgICBkdCA/IEFIQ19TWU5DUkFURV9EVCA6IEFIQ19TWU5DUkFURV9VTFRSQTIpOworCXN5bmNyYXRlID0gYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsQUhDX1NZTkNSQVRFX0RUKTsKIAlhaGNfbG9jayhhaGMsICZmbGFncyk7CiAJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLCBzeW5jcmF0ZSwgcGVyaW9kLCB0aW5mby0+Y3Vyci5vZmZzZXQsCiAJCQkgcHByX29wdGlvbnMsIEFIQ19UUkFOU19HT0FMLCBGQUxTRSk7CkBAIC0zNTE0LDcgKzI4MTIsNiBAQAogCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zCiAJCSYgfk1TR19FWFRfUFBSX1FBU19SRVE7CiAJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5jdXJyLnBlcmlvZDsKLQl1bnNpZ25lZCBpbnQgZHQgPSBwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlOwogCkBAIC0zNTIzLDggKzI4MjAsNyBAQAogCiAJYWhjX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAogCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKLQlzeW5jcmF0ZSA9IGFoY19maW5kX3N5bmNyYXRlKGFoYywgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAotCQkJCSAgICAgZHQgPyBBSENfU1lOQ1JBVEVfRFQgOiBBSENfU1lOQ1JBVEVfVUxUUkEyKTsKKwlzeW5jcmF0ZSA9IGFoY19maW5kX3N5bmNyYXRlKGFoYywgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBBSENfU1lOQ1JBVEVfRFQpOwogCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKIAlhaGNfc2V0X3N5bmNyYXRlKGFoYywgJmRldmluZm8sIHN5bmNyYXRlLCBwZXJpb2QsIHRpbmZvLT5jdXJyLm9mZnNldCwKIAkJCSBwcHJfb3B0aW9ucywgQUhDX1RSQU5TX0dPQUwsIEZBTFNFKTsKQEAgLTM1NTYsNyArMjg1Miw2IEBACiAJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmN1cnIucHByX29wdGlvbnMKIAkJJiB+TVNHX0VYVF9QUFJfSVVfUkVROwogCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7Ci0JdW5zaWduZWQgaW50IGR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZTsKIApAQCAtMzU2NSw4ICsyODYwLDcgQEAKIAogCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKIAkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7Ci0Jc3luY3JhdGUgPSBhaGNfZmluZF9zeW5jcmF0ZShhaGMsICZwZXJpb2QsICZwcHJfb3B0aW9ucywKLQkJCQkgICAgIGR0ID8gQUhDX1NZTkNSQVRFX0RUIDogQUhDX1NZTkNSQVRFX1VMVFJBMik7CisJc3luY3JhdGUgPSBhaGNfZmluZF9zeW5jcmF0ZShhaGMsICZwZXJpb2QsICZwcHJfb3B0aW9ucywgQUhDX1NZTkNSQVRFX0RUKTsKIAlhaGNfbG9jayhhaGMsICZmbGFncyk7CiAJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLCBzeW5jcmF0ZSwgcGVyaW9kLCB0aW5mby0+Y3Vyci5vZmZzZXQsCiAJCQkgcHByX29wdGlvbnMsIEFIQ19UUkFOU19HT0FMLCBGQUxTRSk7CkBAIC0zNTk5LDcgKzI4OTMsNiBAQAogc3RhdGljIGludCBfX2luaXQKIGFoY19saW51eF9pbml0KHZvaWQpCiB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCWFoY19saW51eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBzcGlfYXR0YWNoX3RyYW5zcG9ydCgmYWhjX2xpbnV4X3RyYW5zcG9ydF9mdW5jdGlvbnMpOwogCWlmICghYWhjX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zNjA4LDI5ICsyOTAxLDExIEBACiAJc3BpX3JlbGVhc2VfdHJhbnNwb3J0KGFoY19saW51eF90cmFuc3BvcnRfdGVtcGxhdGUpOwogCWFoY19saW51eF9leGl0KCk7CiAJcmV0dXJuIC1FTk9ERVY7Ci0jZWxzZQotCXNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljN3h4eF9kcml2ZXJfdGVtcGxhdGUpOwotCWlmIChhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZS5wcmVzZW50ID09IDApIHsKLQkJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwKLQkJCQkgICAgICAgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKLQl9Ci0KLQlyZXR1cm4gKDApOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkCiBhaGNfbGludXhfZXhpdCh2b2lkKQogewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCS8qCi0JICogSW4gMi40IHdlIGhhdmUgdG8gdW5yZWdpc3RlciBmcm9tIHRoZSBQQ0kgY29yZSBfYWZ0ZXJfCi0JICogdW5yZWdpc3RlcmluZyBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIHRvIGF2b2lkIGRhbmdsaW5nCi0JICogcmVmZXJlbmNlcy4KLQkgKi8KLQlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljN3h4eF9kcml2ZXJfdGVtcGxhdGUpOwotI2VuZGlmCiAJYWhjX2xpbnV4X3BjaV9leGl0KCk7CiAJYWhjX2xpbnV4X2Vpc2FfZXhpdCgpOwogCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChhaGNfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCmluZGV4IGVkOTAyN2IuLjMwYzIwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaApAQCAtNTksNiArNTksNyBAQAogI2lmbmRlZiBfQUlDN1hYWF9MSU5VWF9IXwogI2RlZmluZSBfQUlDN1hYWF9MSU5VWF9IXwogCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNjYsMTggKzY3LDIxIEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAvKiBGb3IgdGFza2xldCBzdXBwb3J0LiAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogLyogQ29yZSBTQ1NJIGRlZmluaXRpb25zICovCiAjZGVmaW5lIEFJQ19MSUJfUFJFRklYIGFoYwotI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCiAvKiBOYW1lIHNwYWNlIGNvbmZsaWN0IHdpdGggQlNEIHF1ZXVlIG1hY3JvcyAqLwogI2lmZGVmIExJU1RfSEVBRApAQCAtMTA2LDcgKzExMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGFoY19zb2Z0YzsKIHR5cGVkZWYgc3RydWN0IHBjaV9kZXYgKmFoY19kZXZfc29mdGNfdDsKLXR5cGVkZWYgU2NzaV9DbW5kICAgICAgKmFoY19pb19jdHhfdDsKK3R5cGVkZWYgc3RydWN0IHNjc2lfY21uZCAgICAgICphaGNfaW9fY3R4X3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ5dGUgT3JkZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIGFoY19odG9iZTE2KHgpCWNwdV90b19iZTE2KHgpCkBAIC0xNDQsNyArMTQ4LDcgQEAKIGV4dGVybiB1X2ludCBhaWM3eHh4X25vX3Byb2JlOwogZXh0ZXJuIHVfaW50IGFpYzd4eHhfYWxsb3dfbWVtaW87CiBleHRlcm4gaW50IGFpYzd4eHhfZGV0ZWN0X2NvbXBsZXRlOwotZXh0ZXJuIFNjc2lfSG9zdF9UZW1wbGF0ZSBhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzIFNwYWNlL0RNQSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xNzQsMTEgKzE3OCw3IEBACiB9OwogdHlwZWRlZiBzdHJ1Y3QgYWhjX2xpbnV4X2RtYV90YWcqIGJ1c19kbWFfdGFnX3Q7CiAKLXN0cnVjdCBhaGNfbGludXhfZG1hbWFwCi17Ci0JZG1hX2FkZHJfdAlidXNfYWRkcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBhaGNfbGludXhfZG1hbWFwKiBidXNfZG1hbWFwX3Q7Cit0eXBlZGVmIGRtYV9hZGRyX3QgYnVzX2RtYW1hcF90OwogCiB0eXBlZGVmIGludCBidXNfZG1hX2ZpbHRlcl90KHZvaWQqLCBkbWFfYWRkcl90KTsKIHR5cGVkZWYgdm9pZCBidXNfZG1hbWFwX2NhbGxiYWNrX3Qodm9pZCAqLCBidXNfZG1hX3NlZ21lbnRfdCAqLCBpbnQsIGludCk7CkBAIC0yODEsMTIgKzI4MSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU01QIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSB8fCBkZWZpbmVkKFNDU0lfSEFTX0hPU1RfTE9DSykpCi0jZGVmaW5lIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgMQotI2Vsc2UKLSNkZWZpbmUgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyAwCi0jZW5kaWYKLQogI2RlZmluZSBBSUM3WFhYX0RSSVZFUl9WRVJTSU9OICI2LjIuMzYiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZyb250IEVuZCBRdWV1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjgsMjAgKzMyMiwxNSBAQAogICovCiBUQUlMUV9IRUFEKGFoY19idXN5cSwgYWhjX2NtZCk7CiB0eXBlZGVmIGVudW0gewotCUFIQ19ERVZfVU5DT05GSUdVUkVECSA9IDB4MDEsCiAJQUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZID0gMHgwMiwgLyogRnJlZXplIHF1ZXVlIHVudGlsIGFjdGl2ZSA9PSAwICovCi0JQUhDX0RFVl9USU1FUl9BQ1RJVkUJID0gMHgwNCwgLyogT3VyIHRpbWVyIGlzIGFjdGl2ZSAqLwotCUFIQ19ERVZfT05fUlVOX0xJU1QJID0gMHgwOCwgLyogUXVldWVkIHRvIGJlIHJ1biBsYXRlciAqLwogCUFIQ19ERVZfUV9CQVNJQwkJID0gMHgxMCwgLyogQWxsb3cgYmFzaWMgZGV2aWNlIHF1ZXVpbmcgKi8KIAlBSENfREVWX1FfVEFHR0VECSA9IDB4MjAsIC8qIEFsbG93IGZ1bGwgU0NTSTIgY29tbWFuZCBxdWV1ZWluZyAqLwogCUFIQ19ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCi0JQUhDX0RFVl9TTEFWRV9DT05GSUdVUkVEID0gMHg4MAkgLyogc2xhdmVfY29uZmlndXJlKCkgaGFzIGJlZW4gY2FsbGVkICovCiB9IGFoY19saW51eF9kZXZfZmxhZ3M7CiAKIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0Owogc3RydWN0IGFoY19saW51eF9kZXZpY2UgewogCVRBSUxRX0VOVFJZKGFoY19saW51eF9kZXZpY2UpIGxpbmtzOwotCXN0cnVjdAkJYWhjX2J1c3lxIGJ1c3lxOwogCiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjdXJyZW50bHkKQEAgLTM4MiwxMSArMzcxLDYgQEAKIAlhaGNfbGludXhfZGV2X2ZsYWdzCWZsYWdzOwogCiAJLyoKLQkgKiBQZXIgZGV2aWNlIHRpbWVyLgotCSAqLwotCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwotCi0JLyoKIAkgKiBUaGUgaGlnaCBsaW1pdCBmb3IgdGhlIHRhZ3MgdmFyaWFibGUuCiAJICovCiAJdV9pbnQJCQltYXh0YWdzOwpAQCAtNDE5LDcgKzQwMyw3IEBACiAjZGVmaW5lIEFIQ19PVEFHX1RIUkVTSAk1MDAKIAogCWludAkJCWx1bjsKLQlTY3NpX0RldmljZQkgICAgICAgKnNjc2lfZGV2aWNlOworCXN0cnVjdCBzY3NpX2RldmljZSAgICAgICAqc2NzaV9kZXZpY2U7CiAJc3RydWN0CQkJYWhjX2xpbnV4X3RhcmdldCAqdGFyZ2V0OwogfTsKIApAQCAtNDM5LDMyICs0MjMsMTYgQEAKICAqIG1hbm5lciBhbmQgYXJlIGFsbG9jYXRlZCBiZWxvdyA0R0IsIHRoZSBudW1iZXIgb2YgUy9HIHNlZ21lbnRzIGlzCiAgKiB1bnJlc3RyaWN0ZWQuCiAgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLS8qCi0gKiBXZSBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBwcmUtMi41IGtlcm5lbHMgdG8KLSAqIGF2b2lkIGZyYWdtZW50YXRpb24gaXNzdWVzIGluIHRoZSBTQ1NJIG1pZC1sYXllcidzIHByaXZhdGUgbWVtb3J5Ci0gKiBhbGxvY2F0b3IuICBTZWUgYWljN3h4eF9vc20uYyBhaGNfbGludXhfc2l6ZV9uc2VnKCkgZm9yIGRldGFpbHMuCi0gKi8KLWV4dGVybiB1X2ludCBhaGNfbGludXhfbnNlZzsKLSNkZWZpbmUJQUhDX05TRUcgYWhjX2xpbnV4X25zZWcKLSNkZWZpbmUJQUhDX0xJTlVYX01JTl9OU0VHIDY0Ci0jZWxzZQogI2RlZmluZQlBSENfTlNFRyAxMjgKLSNlbmRpZgogCiAvKgogICogUGVyLVNDQiBPU00gc3RvcmFnZS4KICAqLwotdHlwZWRlZiBlbnVtIHsKLQlBSENfVVBfRUhfU0VNQVBIT1JFID0gMHgxCi19IGFoY19saW51eF9zY2JfZmxhZ3M7Ci0KIHN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IGFoY19saW51eF9kZXZpY2UJKmRldjsKIAlkbWFfYWRkcl90CQkgYnVmX2J1c2FkZHI7CiAJdWludDMyX3QJCSB4ZmVyX2xlbjsKIAl1aW50MzJfdAkJIHNlbnNlX3Jlc2lkOwkvKiBBdXRvLVNlbnNlIHJlc2lkdWFsICovCi0JYWhjX2xpbnV4X3NjYl9mbGFncwkgZmxhZ3M7CiB9OwogCiAvKgpAQCAtNDczLDM5ICs0NDEsMjQgQEAKICAqIGFsaWdubWVudCByZXN0cmljdGlvbnMgb2YgdGhlIHZhcmlvdXMgcGxhdGZvcm1zIHN1cHBvcnRlZCBieQogICogdGhpcyBkcml2ZXIuCiAgKi8KLXR5cGVkZWYgZW51bSB7Ci0JQUhDX1JVTl9DTVBMVF9RX1RJTUVSCSA9IDB4MTAKLX0gYWhjX2xpbnV4X3NvZnRjX2ZsYWdzOwotCi1UQUlMUV9IRUFEKGFoY19jb21wbGV0ZXEsIGFoY19jbWQpOwotCiBzdHJ1Y3QgYWhjX3BsYXRmb3JtX2RhdGEgewogCS8qCiAJICogRmllbGRzIGFjY2Vzc2VkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCiAJICovCiAJc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmdldHNbQUhDX05VTV9UQVJHRVRTXTsgCi0JVEFJTFFfSEVBRCgsIGFoY19saW51eF9kZXZpY2UpIGRldmljZV9ydW5xOwotCXN0cnVjdCBhaGNfY29tcGxldGVxCSBjb21wbGV0ZXE7CiAKIAlzcGlubG9ja190CQkgc3Bpbl9sb2NrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkgcnVucV90YXNrbGV0OwogCXVfaW50CQkJIHFmcm96ZW47Ci0JcGlkX3QJCQkgZHZfcGlkOwotCXN0cnVjdCB0aW1lcl9saXN0CSBjb21wbGV0ZXFfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJIHJlc2V0X3RpbWVyOwogCXN0cnVjdCBzZW1hcGhvcmUJIGVoX3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZQkgZHZfY21kX3NlbTsJLyogWFhYIFRoaXMgbmVlZHMgdG8gYmUgaW4KLQkJCQkJCSAqIHRoZSB0YXJnZXQgc3RydWN0Ci0JCQkJCQkgKi8KLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKmR2X3Njc2lfZGV2OwogCXN0cnVjdCBTY3NpX0hvc3QgICAgICAgICpob3N0OwkJLyogcG9pbnRlciB0byBzY3NpIGhvc3QgKi8KICNkZWZpbmUgQUhDX0xJTlVYX05PSVJRCSgodWludDMyX3QpfjApCiAJdWludDMyX3QJCSBpcnE7CQkvKiBJUlEgZm9yIHRoaXMgYWRhcHRlciAqLwogCXVpbnQzMl90CQkgYmlvc19hZGRyZXNzOwogCXVpbnQzMl90CQkgbWVtX2J1c2FkZHI7CS8qIE1lbSBCYXNlIEFkZHIgKi8KLQl1aW50NjRfdAkJIGh3X2RtYV9tYXNrOwotCWFoY19saW51eF9zb2Z0Y19mbGFncwkgZmxhZ3M7CisKKyNkZWZpbmUJQUhDX1VQX0VIX1NFTUFQSE9SRQkgMHgxCisJdWludDMyX3QJCSBmbGFnczsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01OTQsNyArNTQ3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAkJYWhjX2xpbnV4X3JlZ2lzdGVyX2hvc3Qoc3RydWN0IGFoY19zb2Z0YyAqLAotCQkJCQlTY3NpX0hvc3RfVGVtcGxhdGUgKik7CisJCQkJCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKik7CiAKIHVpbnQ2NF90CWFoY19saW51eF9nZXRfbWVtc2l6ZSh2b2lkKTsKIApAQCAtNjE1LDE3ICs1NjgsNiBAQAogc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xvY2soc3RydWN0IGFoY19zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwogCi0vKiBMb2NrIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIHRoZSBhYm92ZSBsb2NrIGluIG1pZGxheWVyIGVudHJ5IHBvaW50cy4gKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soc3RydWN0IGFoY19zb2Z0YyAqLAotCQkJCQkJICB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soc3RydWN0IGFoY19zb2Z0YyAqLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKLQotLyogTG9jayBoZWxkIGR1cmluZyBjb21tYW5kIGNvbXBlbGV0aW9uIHRvIHRoZSB1cHBlciBsYXllciAqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2RvbmVfbG9ja2luaXQoc3RydWN0IGFoY19zb2Z0YyAqKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19kb25lX2xvY2soc3RydWN0IGFoY19zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZG9uZV91bmxvY2soc3RydWN0IGFoY19zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci0KIC8qIExvY2sgaGVsZCBkdXJpbmcgYWhjX2xpc3QgbWFuaXB1bGF0aW9uIGFuZCBhaGMgc29mdGMgZnJlZXMgKi8KIGV4dGVybiBzcGlubG9ja190IGFoY19saXN0X3NwaW5sb2NrOwogc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xpc3RfbG9ja2luaXQodm9pZCk7CkBAIC02NTEsNTcgKzU5Myw2IEBACiB9CiAKIHN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCi17Ci0JLyoKLQkgKiBJbiAyLjUuWCBhbmQgc29tZSAyLjQuWCB2ZXJzaW9ucywgdGhlIG1pZGxheWVyIHRha2VzIG91cgotCSAqIGxvY2sganVzdCBiZWZvcmUgY2FsbGluZyB1cywgc28gd2UgYXZvaWQgbG9ja2luZyBhZ2Fpbi4KLQkgKiBGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuCi0JICoganVzdCBiZWZvcmUgb3VyIGVudHJ5IHBvaW50IGlzIGNhbGxlZC4gIEluIHRoaXMgY2FzZSwgd2UKLQkgKiB0cmFkZSB0aGUgaW9fcmVxdWVzdF9sb2NrIGZvciBvdXIgcGVyLXNvZnRjIGxvY2suCi0JICovCi0jaWYgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCi0Jc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAotCXNwaW5fdW5sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7Ci0Jc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfZG9uZV9sb2NraW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0JLyoKLQkgKiBJbiAyLjUuWCwgb3VyIG93biBsb2NrIGlzIGhlbGQgZHVyaW5nIGNvbXBsZXRpb25zLgotCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHVzZWQuCi0JICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBsb2NrIGFnYWluLgotCSAqLwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX2RvbmVfbG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAotCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssICpmbGFncyk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19kb25lX3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgKmZsYWdzKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAogYWhjX2xpc3RfbG9ja2luaXQodm9pZCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmYWhjX2xpc3Rfc3BpbmxvY2spOwpAQCAtNzY3LDEyICs2NTgsNiBAQAogfSBhaGNfcG93ZXJfc3RhdGU7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSBcCi0gICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykpIFwKLSAgJiYgKCFkZWZpbmVkKENPTkZJR19FSVNBKSkpCi0jZGVmaW5lIENPTkZJR19FSVNBCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19FSVNBCiBleHRlcm4gdWludDMyX3QgYWljN3h4eF9wcm9iZV9laXNhX3ZsOwogaW50CQkJIGFoY19saW51eF9laXNhX2luaXQodm9pZCk7CkBAIC04ODgsMjIgKzc3MywxOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm9jIEZTIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotaW50CWFoY19saW51eF9wcm9jX2luZm8oY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQsIGludCk7Ci0jZWxzZQogaW50CWFoY19saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosCiAJCQkgICAgb2ZmX3QsIGludCwgaW50KTsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERvbWFpbiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zYWN0aW9uIEFjY2VzcyBXcmFwcGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICosIHVpbnQzMl90KTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqLCB1aW50MzJfdCk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICopOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19jbWRfZ2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKiwgaW50LCB1X2ludCk7CiBzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHN0cnVjdCBzY2IgKik7CkBAIC05MjIsNyArODAzLDcgQEAKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYik7CiAKIHN0YXRpYyBfX2lubGluZQotdm9pZCBhaGNfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKK3ZvaWQgYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQogewogCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX1NUQVRVU19NQVNLIDw8IDE2KTsKIAljbWQtPnJlc3VsdCB8PSBzdGF0dXMgPDwgMTY7CkBAIC05MzUsNyArODE2LDcgQEAKIH0KIAogc3RhdGljIF9faW5saW5lCi12b2lkIGFoY19jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kLCB1aW50MzJfdCBzdGF0dXMpCit2b2lkIGFoY19jbWRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQogewogCWNtZC0+cmVzdWx0ICY9IH4weEZGRkY7CiAJY21kLT5yZXN1bHQgfD0gc3RhdHVzOwpAQCAtOTQ4LDcgKzgyOSw3IEBACiB9CiAKIHN0YXRpYyBfX2lubGluZQotdWludDMyX3QgYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqY21kKQordWludDMyX3QgYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlyZXR1cm4gKChjbWQtPnJlc3VsdCA+PiAxNikgJiBDQU1fU1RBVFVTX01BU0spOwogfQpAQCAtOTYwLDcgKzg0MSw3IEBACiB9CiAKIHN0YXRpYyBfX2lubGluZQotdWludDMyX3QgYWhjX2NtZF9nZXRfc2NzaV9zdGF0dXMoU2NzaV9DbW5kICpjbWQpCit1aW50MzJfdCBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJcmV0dXJuIChjbWQtPnJlc3VsdCAmIDB4RkZGRik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCmluZGV4IDZmNjY3NGEuLjJhMGViY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCkBAIC0yMjEsMTMgKzIyMSwxMSBAQAogCSAmJiBhaGNfbGludXhfZ2V0X21lbXNpemUoKSA+IDB4ODAwMDAwMDAKIAkgJiYgcGNpX3NldF9kbWFfbWFzayhwZGV2LCBtYXNrXzM5Yml0KSA9PSAwKSB7CiAJCWFoYy0+ZmxhZ3MgfD0gQUhDXzM5QklUX0FERFJFU1NJTkc7Ci0JCWFoYy0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBtYXNrXzM5Yml0OwogCX0gZWxzZSB7CiAJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWljN3h4eDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOwogICAgICAgICAgICAgICAgIAlyZXR1cm4gKC1FTk9ERVYpOwogCQl9Ci0JCWFoYy0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKIAl9CiAJYWhjLT5kZXZfc29mdGMgPSBwY2k7CiAJZXJyb3IgPSBhaGNfcGNpX2NvbmZpZyhhaGMsIGVudHJ5KTsKQEAgLTIzNiwxNSArMjM0LDggQEAKIAkJcmV0dXJuICgtZXJyb3IpOwogCX0KIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYWhjKTsKLQlpZiAoYWljN3h4eF9kZXRlY3RfY29tcGxldGUpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJaWYgKGFpYzd4eHhfZGV0ZWN0X2NvbXBsZXRlKQogCQlhaGNfbGludXhfcmVnaXN0ZXJfaG9zdChhaGMsICZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7Ci0jZWxzZQotCQlwcmludGYoImFpYzd4eHg6IGlnbm9yaW5nIFBDSSBkZXZpY2UgZm91bmQgYWZ0ZXIgIgotCQkgICAgICAgImluaXRpYWxpemF0aW9uXG4iKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKLSNlbmRpZgotCX0KIAlyZXR1cm4gKDApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCmluZGV4IDg1ZTgwZWUuLjVmZWNlODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCkBAIC0yODksMTMgKzI4OSw4IEBACiAgKiBSZXR1cm4gaW5mb3JtYXRpb24gdG8gaGFuZGxlIC9wcm9jIHN1cHBvcnQgZm9yIHRoZSBkcml2ZXIuCiAgKi8KIGludAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotYWhjX2xpbnV4X3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAotCQkgICAgaW50IGxlbmd0aCwgaW50IGhvc3RubywgaW50IGlub3V0KQotI2Vsc2UKIGFoY19saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAogCQkgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCi0jZW5kaWYKIHsKIAlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CiAJc3RydWN0CWluZm9fc3RyIGluZm87CkBAIC0zMDcsMTUgKzMwMiw3IEBACiAKIAlyZXR2YWwgPSAtRUlOVkFMOwogCWFoY19saXN0X2xvY2soJnMpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCVRBSUxRX0ZPUkVBQ0goYWhjLCAmYWhjX3RhaWxxLCBsaW5rcykgewotCQlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vID09IGhvc3RubykKLQkJCWJyZWFrOwotCX0KLSNlbHNlCiAJYWhjID0gYWhjX2ZpbmRfc29mdGMoKihzdHJ1Y3QgYWhjX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7Ci0jZW5kaWYKLQogCWlmIChhaGMgPT0gTlVMTCkKIAkJZ290byBkb25lOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCmluZGV4IDc5YmZkOWUuLjdjNWE2ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJzY3NpLmgiCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICJhaWNsaWIuaCIKICNpbmNsdWRlICJjYW0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKaW5kZXggMGI1ZDNhNS4uZWU5Yjk2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKQEAgLTEyNTMsMTEgKzEyNTMsMTEgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKEhaICogNSk7CiAKIAlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQV9SRVNFVCkgewotCQlzY3Jfd3JpdGUoYXAsIFNDUl9DT05UUk9MLCAweDMwMSk7IC8qIGlzc3VlIHBoeSB3YWtlL3Jlc2V0ICovCi0JCXNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKTsJLyogZHVtbXkgcmVhZDsgZmx1c2ggKi8KKwkJLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KKwkJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDEpOwogCQl1ZGVsYXkoNDAwKTsJCQkvKiBGSVhNRTogYSBndWVzcyAqLwogCX0KLQlzY3Jfd3JpdGUoYXAsIFNDUl9DT05UUk9MLCAweDMwMCk7CS8qIGlzc3VlIHBoeSB3YWtlL2NsZWFyIHJlc2V0ICovCisJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOyAvKiBwaHkgd2FrZS9jbGVhciByZXNldCAqLwogCiAJLyogd2FpdCBmb3IgcGh5IHRvIGJlY29tZSByZWFkeSwgaWYgbmVjZXNzYXJ5ICovCiAJZG8gewpAQCAtMjUzOSw3ICsyNTM5LDcgQEAKIAlhdGFfc2dfaW5pdF9vbmUocWMsIGNtZC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKIAlxYy0+ZG1hX2RpciA9IERNQV9GUk9NX0RFVklDRTsKIAotCW1lbXNldCgmcWMtPmNkYiwgMCwgc2l6ZW9mKGFwLT5jZGJfbGVuKSk7CisJbWVtc2V0KCZxYy0+Y2RiLCAwLCBhcC0+Y2RiX2xlbik7CiAJcWMtPmNkYlswXSA9IFJFUVVFU1RfU0VOU0U7CiAJcWMtPmNkYls0XSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKIApAQCAtMjgxMSw2ICsyODExLDcgQEAKIAogCS8qIGNhbGwgY29tcGxldGlvbiBjYWxsYmFjayAqLwogCXJjID0gcWMtPmNvbXBsZXRlX2ZuKHFjLCBkcnZfc3RhdCk7CisJcWMtPmZsYWdzICY9IH5BVEFfUUNGTEFHX0FDVElWRTsKIAogCS8qIGlmIGNhbGxiYWNrIGluZGljYXRlcyBub3QgdG8gY29tcGxldGUgY29tbWFuZCAobm9uLXplcm8pLAogCSAqIHJldHVybiBpbW1lZGlhdGVseQpAQCAtMzIyOSw3ICszMjMwLDggQEAKIAkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAKIAkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpCisJCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkgJiYKKwkJCSAgICAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpKQogCQkJCWhhbmRsZWQgfD0gYXRhX2hvc3RfaW50cihhcCwgcWMpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwppbmRleCA0Yzk2ZGYwLi40MTZiYTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwpAQCAtMzQ3LDcgKzM0NywxMCBAQAogCQkgKi8KIAkJaWYgKChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KSAmJgogCQkgICAgKChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xPQ0tfU0VDVE9SUykgPT0gMCkpIHsKLQkJCXNkZXYtPmhvc3QtPm1heF9zZWN0b3JzID0gMjA0ODsKKwkJCS8qCisJCQkgKiBkbyBub3Qgb3ZlcndyaXRlIHNkZXYtPmhvc3QtPm1heF9zZWN0b3JzLCBzaW5jZQorCQkJICogb3RoZXIgZHJpdmVzIG9uIHRoaXMgaG9zdCBtYXkgbm90IHN1cHBvcnQgTEJBNDgKKwkJCSAqLwogCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHNkZXYtPnJlcXVlc3RfcXVldWUsIDIwNDgpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYwppbmRleCA4ZDFhNWQyLi4wNTA3NWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAKIAkvKiBDbGVhciBhIG1hZ2ljIGJpdCBpbiBTQ1IxIGFjY29yZGluZyB0byBEYXJ3aW4sIHRob3NlIGhlbHAKIAkgKiBzb21lIGZ1bmt5IHNlYWdhdGUgZHJpdmVzICh0aG91Z2ggc28gZmFyLCB0aG9zZSB3ZXJlIGFscmVhZHkKLQkgKiBzZXQgYnkgdGhlIGZpcm13YXJlIG9uIHRoZSBtYWNoaW5lcyBJIGhhZCBhY2Nlc3MgdG8KKwkgKiBzZXQgYnkgdGhlIGZpcm13YXJlIG9uIHRoZSBtYWNoaW5lcyBJIGhhZCBhY2Nlc3MgdG8pCiAJICovCiAJd3JpdGVsKHJlYWRsKG1taW9fYmFzZSArIEsyX1NBVEFfU0lDUjFfT0ZGU0VUKSAmIH4weDAwMDQwMDAwLAogCSAgICAgICBtbWlvX2Jhc2UgKyBLMl9TQVRBX1NJQ1IxX09GRlNFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKaW5kZXggMjg5NjZkMC4uNjdjNmNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjZGVmaW5lIFNQSV9QUklOVEsoeCwgbCwgZiwgYS4uLikJZGV2X3ByaW50ayhsLCAmKHgpLT5kZXYsIGYgLCAjI2EpCiAKLSNkZWZpbmUgU1BJX05VTV9BVFRSUyAxMAkvKiBpbmNyZWFzZSB0aGlzIGlmIHlvdSBhZGQgYXR0cmlidXRlcyAqLworI2RlZmluZSBTUElfTlVNX0FUVFJTIDEzCS8qIGluY3JlYXNlIHRoaXMgaWYgeW91IGFkZCBhdHRyaWJ1dGVzICovCiAjZGVmaW5lIFNQSV9PVEhFUl9BVFRSUyAxCS8qIEluY3JlYXNlIHRoaXMgaWYgeW91IGFkZCAiYWx3YXlzCiAJCQkJICogb24iIGF0dHJpYnV0ZXMgKi8KICNkZWZpbmUgU1BJX0hPU1RfQVRUUlMJMQpAQCAtMjE5LDggKzIxOSwxMSBAQAogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KGRldik7CiAKIAlzcGlfcGVyaW9kKHN0YXJnZXQpID0gLTE7CS8qIGlsbGVnYWwgdmFsdWUgKi8KKwlzcGlfbWluX3BlcmlvZChzdGFyZ2V0KSA9IDA7CiAJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CS8qIGFzeW5jICovCisJc3BpX21heF9vZmZzZXQoc3RhcmdldCkgPSAyNTU7CiAJc3BpX3dpZHRoKHN0YXJnZXQpID0gMDsJLyogbmFycm93ICovCisJc3BpX21heF93aWR0aChzdGFyZ2V0KSA9IDE7CiAJc3BpX2l1KHN0YXJnZXQpID0gMDsJLyogbm8gSVUgKi8KIAlzcGlfZHQoc3RhcmdldCkgPSAwOwkvKiBTVCAqLwogCXNwaV9xYXMoc3RhcmdldCkgPSAwOwpAQCAtMjM1LDYgKzIzOCwzNCBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIHNwaV90cmFuc3BvcnRfc2hvd19zaW1wbGUoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICp0cDsJCQkJCVwKKwkJCQkJCQkJCVwKKwl0cCA9IChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSZzdGFyZ2V0LT5zdGFyZ2V0X2RhdGE7CVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgZm9ybWF0X3N0cmluZywgdHAtPmZpZWxkKTsJCVwKK30KKworI2RlZmluZSBzcGlfdHJhbnNwb3J0X3N0b3JlX3NpbXBsZShmaWVsZCwgZm9ybWF0X3N0cmluZykJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9zcGlfdHJhbnNwb3J0XyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkgICAgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCWludCB2YWw7CQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICp0cDsJCQkJCVwKKwkJCQkJCQkJCVwKKwl0cCA9IChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSZzdGFyZ2V0LT5zdGFyZ2V0X2RhdGE7CVwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwkJCQlcCisJdHAtPmZpZWxkID0gdmFsOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30KKwogI2RlZmluZSBzcGlfdHJhbnNwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCiAJCQkJCQkJCQlcCiBzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApAQCAtMjYxLDYgKzI5MiwyNSBAQAogCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwlcCiAJCQkJCQkJCQlcCiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsJCQkJXAorCWktPmYtPnNldF8jI2ZpZWxkKHN0YXJnZXQsIHZhbCk7CQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIHNwaV90cmFuc3BvcnRfc3RvcmVfbWF4KGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9zcGlfdHJhbnNwb3J0XyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLCBcCisJCQkgICAgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCWludCB2YWw7CQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwlcCisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHAJCQkJCVwKKwkJPSAoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOwlcCisJCQkJCQkJCQlcCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsJCQkJXAorCWlmICh2YWwgPiB0cC0+bWF4XyMjZmllbGQpCQkJCQlcCisJCXZhbCA9IHRwLT5tYXhfIyNmaWVsZDsJCQkJCVwKIAlpLT5mLT5zZXRfIyNmaWVsZChzdGFyZ2V0LCB2YWwpOwkJCQlcCiAJcmV0dXJuIGNvdW50OwkJCQkJCQlcCiB9CkBAIC0yNzIsOSArMzIyLDI0IEBACiAJCQkgc2hvd19zcGlfdHJhbnNwb3J0XyMjZmllbGQsCQkJXAogCQkJIHN0b3JlX3NwaV90cmFuc3BvcnRfIyNmaWVsZCk7CiAKKyNkZWZpbmUgc3BpX3RyYW5zcG9ydF9zaW1wbGVfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZykJCQlcCisJc3BpX3RyYW5zcG9ydF9zaG93X3NpbXBsZShmaWVsZCwgZm9ybWF0X3N0cmluZykJCQlcCisJc3BpX3RyYW5zcG9ydF9zdG9yZV9zaW1wbGUoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJCSBzaG93X3NwaV90cmFuc3BvcnRfIyNmaWVsZCwJCQlcCisJCQkgc3RvcmVfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkKTsKKworI2RlZmluZSBzcGlfdHJhbnNwb3J0X21heF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKKwlzcGlfdHJhbnNwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCisJc3BpX3RyYW5zcG9ydF9zdG9yZV9tYXgoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorCXNwaV90cmFuc3BvcnRfc2ltcGxlX2F0dHIobWF4XyMjZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKKwkJCSBzaG93X3NwaV90cmFuc3BvcnRfIyNmaWVsZCwJCQlcCisJCQkgc3RvcmVfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkKTsKKwogLyogVGhlIFBhcmFsbGVsIFNDU0kgVHJhbnBvcnQgQXR0cmlidXRlczogKi8KLXNwaV90cmFuc3BvcnRfcmRfYXR0cihvZmZzZXQsICIlZFxuIik7Ci1zcGlfdHJhbnNwb3J0X3JkX2F0dHIod2lkdGgsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X21heF9hdHRyKG9mZnNldCwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfbWF4X2F0dHIod2lkdGgsICIlZFxuIik7CiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIoaXUsICIlZFxuIik7CiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIoZHQsICIlZFxuIik7CiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIocWFzLCAiJWRcbiIpOwpAQCAtMzAwLDI2ICszNjUsMTggQEAKIAogLyogVHJhbnNsYXRlIHRoZSBwZXJpb2QgaW50byBucyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3BlYwogICogZm9yIFNEVFIvUFBSIG1lc3NhZ2VzICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKLQorc3RhdGljIHNzaXplX3QKK3Nob3dfc3BpX3RyYW5zcG9ydF9wZXJpb2RfaGVscGVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZiwKKwkJCQkgaW50IHBlcmlvZCkKIHsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHA7CiAJaW50IGxlbiwgcGljb3NlYzsKLQlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKIAotCXRwID0gKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJnN0YXJnZXQtPnN0YXJnZXRfZGF0YTsKLQotCWlmIChpLT5mLT5nZXRfcGVyaW9kKQotCQlpLT5mLT5nZXRfcGVyaW9kKHN0YXJnZXQpOwotCi0JaWYgKHRwLT5wZXJpb2QgPCAwIHx8IHRwLT5wZXJpb2QgPiAweGZmKSB7CisJaWYgKHBlcmlvZCA8IDAgfHwgcGVyaW9kID4gMHhmZikgewogCQlwaWNvc2VjID0gLTE7Ci0JfSBlbHNlIGlmICh0cC0+cGVyaW9kIDw9IFNQSV9TVEFUSUNfUFBSKSB7Ci0JCXBpY29zZWMgPSBwcHJfdG9fcHNbdHAtPnBlcmlvZF07CisJfSBlbHNlIGlmIChwZXJpb2QgPD0gU1BJX1NUQVRJQ19QUFIpIHsKKwkJcGljb3NlYyA9IHBwcl90b19wc1twZXJpb2RdOwogCX0gZWxzZSB7Ci0JCXBpY29zZWMgPSB0cC0+cGVyaW9kICogNDAwMDsKKwkJcGljb3NlYyA9IHBlcmlvZCAqIDQwMDA7CiAJfQogCiAJaWYgKHBpY29zZWMgPT0gLTEpIHsKQEAgLTMzNCwxMiArMzkxLDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLXN0b3JlX3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICBzaXplX3QgY291bnQpCitzdG9yZV9zcGlfdHJhbnNwb3J0X3BlcmlvZF9oZWxwZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBpbnQgKnBlcmlvZHApCiB7Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CiAJaW50IGosIHBpY29zZWMsIHBlcmlvZCA9IC0xOwogCWNoYXIgKmVuZHA7CiAKQEAgLTM2OCwxNSArNDIyLDc5IEBACiAJaWYgKHBlcmlvZCA+IDB4ZmYpCiAJCXBlcmlvZCA9IDB4ZmY7CiAKLQlpLT5mLT5zZXRfcGVyaW9kKHN0YXJnZXQsIHBlcmlvZCk7CisJKnBlcmlvZHAgPSBwZXJpb2Q7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitzaG93X3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHAgPQorCQkoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOworCisJaWYgKGktPmYtPmdldF9wZXJpb2QpCisJCWktPmYtPmdldF9wZXJpb2Qoc3RhcmdldCk7CisKKwlyZXR1cm4gc2hvd19zcGlfdHJhbnNwb3J0X3BlcmlvZF9oZWxwZXIoY2RldiwgYnVmLCB0cC0+cGVyaW9kKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKnRwID0KKwkJKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJnN0YXJnZXQtPnN0YXJnZXRfZGF0YTsKKwlpbnQgcGVyaW9kLCByZXR2YWw7CisKKwlyZXR2YWwgPSBzdG9yZV9zcGlfdHJhbnNwb3J0X3BlcmlvZF9oZWxwZXIoY2RldiwgYnVmLCBjb3VudCwgJnBlcmlvZCk7CisKKwlpZiAocGVyaW9kIDwgdHAtPm1pbl9wZXJpb2QpCisJCXBlcmlvZCA9IHRwLT5taW5fcGVyaW9kOworCisJaS0+Zi0+c2V0X3BlcmlvZChzdGFyZ2V0LCBwZXJpb2QpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHBlcmlvZCwgU19JUlVHTyB8IFNfSVdVU1IsIAogCQkJIHNob3dfc3BpX3RyYW5zcG9ydF9wZXJpb2QsCiAJCQkgc3RvcmVfc3BpX3RyYW5zcG9ydF9wZXJpb2QpOwogCitzdGF0aWMgc3NpemVfdAorc2hvd19zcGlfdHJhbnNwb3J0X21pbl9wZXJpb2Qoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICp0cCA9CisJCShzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSZzdGFyZ2V0LT5zdGFyZ2V0X2RhdGE7CisKKwlyZXR1cm4gc2hvd19zcGlfdHJhbnNwb3J0X3BlcmlvZF9oZWxwZXIoY2RldiwgYnVmLCB0cC0+bWluX3BlcmlvZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zcGlfdHJhbnNwb3J0X21pbl9wZXJpb2Qoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHAgPQorCQkoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOworCisJcmV0dXJuIHN0b3JlX3NwaV90cmFuc3BvcnRfcGVyaW9kX2hlbHBlcihjZGV2LCBidWYsIGNvdW50LAorCQkJCQkJICZ0cC0+bWluX3BlcmlvZCk7Cit9CisKKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1pbl9wZXJpb2QsIFNfSVJVR08gfCBTX0lXVVNSLCAKKwkJCSBzaG93X3NwaV90cmFuc3BvcnRfbWluX3BlcmlvZCwKKwkJCSBzdG9yZV9zcGlfdHJhbnNwb3J0X21pbl9wZXJpb2QpOworCisKIHN0YXRpYyBzc2l6ZV90IHNob3dfc3BpX2hvc3Rfc2lnbmFsbGluZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CkBAIC02NDIsNiArNzYwLDcgQEAKIHsKIAlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNyZXEtPnNyX2hvc3QtPnRyYW5zcG9ydHQpOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKIAlpbnQgbGVuID0gc2Rldi0+aW5xdWlyeV9sZW47CiAJLyogZmlyc3Qgc2V0IHVzIHVwIGZvciBuYXJyb3cgYXN5bmMgKi8KIAlEVl9TRVQob2Zmc2V0LCAwKTsKQEAgLTY1NSw5ICs3NzQsMTEgQEAKIAl9CiAKIAkvKiB0ZXN0IHdpZHRoICovCi0JaWYgKGktPmYtPnNldF93aWR0aCAmJiBzZGV2LT53ZHRyKSB7CisJaWYgKGktPmYtPnNldF93aWR0aCAmJiBzcGlfbWF4X3dpZHRoKHN0YXJnZXQpICYmIHNkZXYtPndkdHIpIHsKIAkJaS0+Zi0+c2V0X3dpZHRoKHNkZXYtPnNkZXZfdGFyZ2V0LCAxKTsKIAorCQlwcmludGsoIldJRFRIIElTICVkXG4iLCBzcGlfbWF4X3dpZHRoKHN0YXJnZXQpKTsKKwogCQlpZiAoc3BpX2R2X2RldmljZV9jb21wYXJlX2lucXVpcnkoc3JlcSwgYnVmZmVyLAogCQkJCQkJICAgYnVmZmVyICsgbGVuLAogCQkJCQkJICAgRFZfTE9PUFMpCkBAIC02ODQsOCArODA1LDggQEAKICByZXRyeToKIAogCS8qIG5vdyBzZXQgdXAgdG8gdGhlIG1heGltdW0gKi8KLQlEVl9TRVQob2Zmc2V0LCAyNTUpOwotCURWX1NFVChwZXJpb2QsIDEpOworCURWX1NFVChvZmZzZXQsIHNwaV9tYXhfb2Zmc2V0KHN0YXJnZXQpKTsKKwlEVl9TRVQocGVyaW9kLCBzcGlfbWluX3BlcmlvZChzdGFyZ2V0KSk7CiAKIAlpZiAobGVuID09IDApIHsKIAkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9JTkZPLCAiRG9tYWluIFZhbGlkYXRpb24gc2tpcHBpbmcgd3JpdGUgdGVzdHNcbiIpOwpAQCAtODkyLDYgKzEwMTMsMTYgQEAKIAlpZiAoaS0+Zi0+c2hvd18jI2ZpZWxkKQkJCQkJCVwKIAkJY291bnQrKwogCisjZGVmaW5lIFNFVFVQX1JFTEFURURfQVRUUklCVVRFKGZpZWxkLCByZWxfZmllbGQpCQkJXAorCWktPnByaXZhdGVfYXR0cnNbY291bnRdID0gY2xhc3NfZGV2aWNlX2F0dHJfIyNmaWVsZDsJCVwKKwlpZiAoIWktPmYtPnNldF8jI3JlbF9maWVsZCkgewkJCQkJXAorCQlpLT5wcml2YXRlX2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCQlpLT5wcml2YXRlX2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCX0JCQkJCQkJCVwKKwlpLT5hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9hdHRyc1tjb3VudF07CQkJXAorCWlmIChpLT5mLT5zaG93XyMjcmVsX2ZpZWxkKQkJCQkJXAorCQljb3VudCsrCisKICNkZWZpbmUgU0VUVVBfSE9TVF9BVFRSSUJVVEUoZmllbGQpCQkJCQlcCiAJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyXyMjZmllbGQ7CVwKIAlpZiAoIWktPmYtPnNldF8jI2ZpZWxkKSB7CQkJCQlcCkBAIC05NzUsOCArMTEwNiwxMSBAQAogCWktPmYgPSBmdDsKIAogCVNFVFVQX0FUVFJJQlVURShwZXJpb2QpOworCVNFVFVQX1JFTEFURURfQVRUUklCVVRFKG1pbl9wZXJpb2QsIHBlcmlvZCk7CiAJU0VUVVBfQVRUUklCVVRFKG9mZnNldCk7CisJU0VUVVBfUkVMQVRFRF9BVFRSSUJVVEUobWF4X29mZnNldCwgb2Zmc2V0KTsKIAlTRVRVUF9BVFRSSUJVVEUod2lkdGgpOworCVNFVFVQX1JFTEFURURfQVRUUklCVVRFKG1heF93aWR0aCwgd2lkdGgpOwogCVNFVFVQX0FUVFJJQlVURShpdSk7CiAJU0VUVVBfQVRUUklCVVRFKGR0KTsKIAlTRVRVUF9BVFRSSUJVVEUocWFzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzIxMjg1LmMgYi9kcml2ZXJzL3NlcmlhbC8yMTI4NS5jCmluZGV4IDMzZmJkYTcuLjBiMTAxNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzIxMjg1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvMjEyODUuYwpAQCAtMTI2LDE4ICsxMjYsOCBAQAogCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCX0KIAotCQlpZiAoKHJ4cyAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkgewotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7Ci0JCX0KLQkJaWYgKChyeHMgJiBSWFNUQVRfT1ZFUlJVTikgJiYKLQkJICAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCS8qCi0JCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MgcmVwb3J0ZWQKLQkJCSAqIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQKLQkJCSAqIGNoYXJhY3Rlci4KLQkJCSAqLwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7Ci0JCX0KKwkJdWFydF9pbnNlcnRfY2hhcihwb3J0LCByeHMsIFJYU1RBVF9PVkVSUlVOLCBjaCwgZmxhZyk7CisKIAkJc3RhdHVzID0gKkNTUl9VQVJURkxHOwogCX0KIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IDBkOTM1ODYuLjMwZThiZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTY4Miw4ICs2ODIsNiBAQAogCSAqIGZyb20gRVhDUjEuIFN3aXRjaCBiYWNrIHRvIGJhbmsgMCwgY2hhbmdlIGl0IGluIE1DUi4gVGhlbgogCSAqIHN3aXRjaCBiYWNrIHRvIGJhbmsgMiwgcmVhZCBpdCBmcm9tIEVYQ1IxIGFnYWluIGFuZCBjaGVjawogCSAqIGl0J3MgY2hhbmdlZC4gSWYgc28sIHNldCBiYXVkX2Jhc2UgaW4gRVhDUjIgdG8gOTIxNjAwLiAtLSBkd213MgotCSAqIE9uIFBvd2VyUEMgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYmF1ZF9iYXNlLCBhcyB3ZSBoYXZlCi0JICogYSBudW1iZXIgb2YgZGlmZmVyZW50IGRpdmlzb3JzLiAgLS0gVG9tIFJpbmkKIAkgKi8KIAlzZXJpYWxfb3V0cCh1cCwgVUFSVF9MQ1IsIDApOwogCXN0YXR1czEgPSBzZXJpYWxfaW4odXAsIFVBUlRfTUNSKTsKQEAgLTY5OSwxNiArNjk3LDI1IEBACiAJCXNlcmlhbF9vdXRwKHVwLCBVQVJUX01DUiwgc3RhdHVzMSk7CiAKIAkJaWYgKChzdGF0dXMyIF4gc3RhdHVzMSkgJiBVQVJUX01DUl9MT09QKSB7Ci0jaWZuZGVmIENPTkZJR19QUEMKKwkJCXVuc2lnbmVkIHNob3J0IHF1b3Q7CisKIAkJCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0xDUiwgMHhFMCk7CisKKwkJCXF1b3QgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0RMTSkgPDwgODsKKwkJCXF1b3QgKz0gc2VyaWFsX2lucCh1cCwgVUFSVF9ETEwpOworCQkJcXVvdCA8PD0gMzsKKwogCQkJc3RhdHVzMSA9IHNlcmlhbF9pbih1cCwgMHgwNCk7IC8qIEVYQ1IxICovCiAJCQlzdGF0dXMxICY9IH4weEIwOyAvKiBEaXNhYmxlIExPQ0ssIG1hc2sgb3V0IFBSRVNMWzAxXSAqLwogCQkJc3RhdHVzMSB8PSAweDEwOyAgLyogMS42MjUgZGl2aXNvciBmb3IgYmF1ZF9iYXNlIC0tPiA5MjE2MDAgKi8KIAkJCXNlcmlhbF9vdXRwKHVwLCAweDA0LCBzdGF0dXMxKTsKLQkJCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0xDUiwgMCk7Ci0JCQl1cC0+cG9ydC51YXJ0Y2xrID0gOTIxNjAwKjE2OwotI2VuZGlmCisJCQkKKwkJCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0RMTCwgcXVvdCAmIDB4ZmYpOworCQkJc2VyaWFsX291dHAodXAsIFVBUlRfRExNLCBxdW90ID4+IDgpOwogCisJCQlzZXJpYWxfb3V0cCh1cCwgVUFSVF9MQ1IsIDApOworCisJCQl1cC0+cG9ydC51YXJ0Y2xrID0gOTIxNjAwKjE2OwogCQkJdXAtPnBvcnQudHlwZSA9IFBPUlRfTlMxNjU1MEE7CiAJCQl1cC0+Y2FwYWJpbGl0aWVzIHw9IFVBUlRfTkFUU0VNSTsKIAkJCXJldHVybjsKQEAgLTExMjIsMTggKzExMjksOSBAQAogCQl9CiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZ1cC0+cG9ydCwgY2gsIHJlZ3MpKQogCQkJZ290byBpZ25vcmVfY2hhcjsKLQkJaWYgKChsc3IgJiB1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwotCQl9Ci0JCWlmICgobHNyICYgVUFSVF9MU1JfT0UpICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkvKgotCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkCi0JCQkgKiBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50Ci0JCQkgKiBjaGFyYWN0ZXIuCi0JCQkgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCQl9CisKKwkJdWFydF9pbnNlcnRfY2hhcigmdXAtPnBvcnQsIGxzciwgVUFSVF9MU1JfT0UsIGNoLCBmbGFnKTsKKwogCWlnbm9yZV9jaGFyOgogCQlsc3IgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CiAJfSB3aGlsZSAoKGxzciAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKaW5kZXggZjJhNWUyOS4uMjg4NGIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYwpAQCAtMTk4LDE4ICsxOTgsOCBAQAogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LCBjaCwgcmVncykpCiAJCQlnb3RvIGlnbm9yZV9jaGFyOwogCi0JCWlmICgocnNyICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJfQotCQlpZiAoKHJzciAmIFVBUlQwMXhfUlNSX09FKSAmJgotCQkgICAgdHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJLyoKLQkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAotCQkJICogaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudAotCQkJICogY2hhcmFjdGVyCi0JCQkgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCQl9CisJCXVhcnRfaW5zZXJ0X2NoYXIocG9ydCwgcnNyLCBVQVJUMDF4X1JTUl9PRSwgY2gsIGZsYWcpOworCiAJaWdub3JlX2NoYXI6CiAJCXN0YXR1cyA9IFVBUlRfR0VUX0ZSKHBvcnQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCBkNWNiZWYzLi43ZGI4OGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC0xNjMsMTggKzE2Myw4IEBACiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZ1YXAtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gaWdub3JlX2NoYXI7CiAKLQkJaWYgKChyc3IgJiB1YXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJfQotCQlpZiAoKHJzciAmIFVBUlQwMXhfUlNSX09FKSAmJgotCQkgICAgdHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJLyoKLQkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAotCQkJICogaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudAotCQkJICogY2hhcmFjdGVyCi0JCQkgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCQl9CisJCXVhcnRfaW5zZXJ0X2NoYXIoJnVhcC0+cG9ydCwgcnNyLCBVQVJUMDF4X1JTUl9PRSwgY2gsIGZsYWcpOworCiAJaWdub3JlX2NoYXI6CiAJCXN0YXR1cyA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxeF9GUik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYyBiL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMKaW5kZXggNjI0MmYzMC4uZTkyNTIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYworKysgYi9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jCkBAIC0xNDMsMTAgKzE0Myw3IEBACiAJCSAqIENIRUNLOiBkb2VzIG92ZXJydW4gYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3Rlcj8KIAkJICogQVNTVU1QVElPTjogaXQgZG9lcyBub3QuCiAJCSAqLwotCQlpZiAoKGNoICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICYgflJYU1RBVF9PVkVSUlVOKSA9PSAwKQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxnKTsKLQkJaWYgKChjaCAmIH5wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiBSWFNUQVRfT1ZFUlJVTikgPT0gMCkKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQl1YXJ0X2luc2VydF9jaGFyKHBvcnQsIGNoLCBVQVJURFJfT1ZFUlIsIGNoLCBmbGcpOwogCiAJaWdub3JlX2NoYXI6CiAJCXN0YXR1cyA9IGNscHNfcmVhZGwoU1lTRkxHKHBvcnQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggNTFkOGE0OS4uOWRjMTUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTE2MSwyMCArMTYxLDEyIEBACiAJCQllbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpCiAJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQorCiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZ1cC0+cG9ydCwgY2gsIHJlZ3MpKQogCQkJZ290byBpZ25vcmVfY2hhcjsKLQkJaWYgKCgqc3RhdHVzICYgdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJfQotCQlpZiAoKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgJiYKLQkJICAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCS8qCi0JCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MgcmVwb3J0ZWQKLQkJCSAqIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQKLQkJCSAqIGNoYXJhY3Rlci4KLQkJCSAqLwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7Ci0JCX0KKworCQl1YXJ0X2luc2VydF9jaGFyKCZ1cC0+cG9ydCwgKnN0YXR1cywgVUFSVF9MU1JfT0UsIGNoLCBmbGFnKTsKKwogCWlnbm9yZV9jaGFyOgogCQkqc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX0xTUik7CiAJfSB3aGlsZSAoKCpzdGF0dXMgJiBVQVJUX0xTUl9EUikgJiYgKG1heF9jb3VudC0tID4gMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCmluZGV4IDQzNTc1MGQuLjJhOWY3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKQEAgLTM5NCwyMCArMzk0LDcgQEAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gsIHJlZ3MpKQogCQkJZ290byBpZ25vcmVfY2hhcjsKIAotCQlpZiAoKHVlcnN0YXQgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwotCQl9Ci0KLQkJaWYgKCh1ZXJzdGF0ICYgUzNDMjQxMF9VRVJTVEFUX09WRVJSVU4pICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkvKgotCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkCi0JCQkgKiBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50Ci0JCQkgKiBjaGFyYWN0ZXIuCi0JCQkgKi8KLQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7Ci0JCX0KKwkJdWFydF9pbnNlcnRfY2hhcihwb3J0LCB1ZXJzdGF0LCBTM0MyNDEwX1VFUlNUQVRfT1ZFUlJVTiwgY2gsIGZsYWcpOwogCiAJaWdub3JlX2NoYXI6CiAJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwppbmRleCAxNTcyMThiLi4yMjU2NWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwpAQCAtMjM3LDEwICsyMzcsNyBAQAogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcigmc3BvcnQtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gaWdub3JlX2NoYXI7CiAKLQkJaWYgKChzdGF0dXMgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiB+VVRTUjFfVE9fU00oVVRTUjFfUk9SKSkgPT0gMCkKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsZyk7Ci0JCWlmIChzdGF0dXMgJiB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICYgVVRTUjFfVE9fU00oVVRTUjFfUk9SKSkKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQl1YXJ0X2luc2VydF9jaGFyKCZzcG9ydC0+cG9ydCwgc3RhdHVzLCBVVFNSMV9UT19TTShVVFNSMV9ST1IpLCBjaCwgZmxnKTsKIAogCWlnbm9yZV9jaGFyOgogCQlzdGF0dXMgPSBVVFNSMV9UT19TTShVQVJUX0dFVF9VVFNSMShzcG9ydCkpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKaW5kZXggNmVlYjQ4Zi4uMGQ3YjY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKQEAgLTY2MSwxMCArNjYxLDEwIEBACiAJLyogSXMgdGhpcyBhIG11bHRpcG9ydCBjYXJkPyAqLwogCXR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwogCWlmIChmaXJzdF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgewotCQlpbmZvLT5tYW5maWQgPSBsZTE2X3RvX2NwdShidWZbMF0pOworCQlpbmZvLT5tYW5maWQgPSBwYXJzZS0+bWFuZmlkLm1hbmY7CiAJCWZvciAoaSA9IDA7IGkgPCBNVUxUSV9DT1VOVDsgaSsrKQogCQkJaWYgKChpbmZvLT5tYW5maWQgPT0gbXVsdGlfaWRbaV0ubWFuZmlkKSAmJgotCQkJICAgIChsZTE2X3RvX2NwdShidWZbMV0pID09IG11bHRpX2lkW2ldLnByb2RpZCkpCisJCQkgICAgKHBhcnNlLT5tYW5maWQuY2FyZCA9PSBtdWx0aV9pZFtpXS5wcm9kaWQpKQogCQkJCWJyZWFrOwogCQlpZiAoaSA8IE1VTFRJX0NPVU5UKQogCQkJaW5mby0+bXVsdGkgPSBtdWx0aV9pZFtpXS5tdWx0aTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCmluZGV4IDg1Y2ZhMDguLjU2ZjI2OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYwpAQCAtMTkwLDE4ICsxOTAsNyBAQAogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhciAocG9ydCwgKHVuc2lnbmVkIGNoYXIpIGRhdGEsIHJlZ3MpKQogCQkJY29udGludWU7CiAKLQkJaWYgKChkYXRhICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGEsIGZsYWcpOwotCQl9Ci0JCWlmICgoZGF0YSAmIFJ4T3ZlcnJ1bkVycm9yKQotCQkgICAgJiYgdHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJLyoKLQkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAotCQkJICogaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudAotCQkJICogY2hhcmFjdGVyCi0JCQkgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCQl9CisJCXVhcnRfaW5zZXJ0X2NoYXIocG9ydCwgZGF0YSwgUnhPdmVycnVuRXJyb3IsIGRhdGEsIGZsYWcpOwogCX0KIAl0dHlfZmxpcF9idWZmZXJfcHVzaCAodHR5KTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwppbmRleCAzN2IyZWYyLi4zZjEwNTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKQEAgLTM1MCwxOCArMzUwLDkgQEAKIAkJfQogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcigmdXAtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gaWdub3JlX2NoYXI7Ci0JCWlmICgoZGlzciAmIHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkgewotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7Ci0JCX0KLQkJaWYgKChkaXNyICYgVFhYOV9TSURJU1JfVU9FUikgJiYKLQkJICAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCS8qCi0JCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MgcmVwb3J0ZWQKLQkJCSAqIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQKLQkJCSAqIGNoYXJhY3Rlci4KLQkJCSAqLwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7Ci0JCX0KKworCQl1YXJ0X2luc2VydF9jaGFyKCZ1cC0+cG9ydCwgZGlzciwgVFhYOV9TSURJU1JfVU9FUiwgY2gsIGZsYWcpOworCiAJaWdub3JlX2NoYXI6CiAJCWRpc3IgPSBzaW9faW4odXAsIFRYWDlfU0lESVNSKTsKIAl9IHdoaWxlICghKGRpc3IgJiBUWFg5X1NJRElTUl9VVkFMSUQpICYmIChtYXhfY291bnQtLSA+IDApKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggMzliNzg4ZC4uMTBlMjk5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTYxLDYgKzYxLDE2IEBACiAJdW5zaWduZWQgY2hhcgkJCXB2cl9kdHJfYml0OwkvKiBXaGljaCBQVlIgYml0IGlzIERUUiAqLwogCXVuc2lnbmVkIGNoYXIJCQlwdnJfZHNyX2JpdDsJLyogV2hpY2ggUFZSIGJpdCBpcyBEU1IgKi8KIAlpbnQJCQkJdHlwZTsJCS8qIFNBQjgyNTMyIHZlcnNpb24JKi8KKworCS8qIFNldHRpbmcgY29uZmlndXJhdGlvbiBiaXRzIHdoaWxlIHRoZSB0cmFuc21pdHRlciBpcyBhY3RpdmUKKwkgKiBjYW4gY2F1c2UgZ2FyYmFnZSBjaGFyYWN0ZXJzIHRvIGdldCBlbWl0dGVkIGJ5IHRoZSBjaGlwLgorCSAqIFRoZXJlZm9yZSwgd2UgY2FjaGUgc3VjaCB3cml0ZXMgaGVyZSBhbmQgZG8gdGhlIHJlYWwgcmVnaXN0ZXIKKwkgKiB3cml0ZSB0aGUgbmV4dCB0aW1lIHRoZSB0cmFuc21pdHRlciBiZWNvbWVzIGlkbGUuCisJICovCisJdW5zaWduZWQgaW50CQkJY2FjaGVkX2Vicmc7CisJdW5zaWduZWQgY2hhcgkJCWNhY2hlZF9tb2RlOworCXVuc2lnbmVkIGNoYXIJCQljYWNoZWRfcHZyOworCXVuc2lnbmVkIGNoYXIJCQljYWNoZWRfZGFmbzsKIH07CiAKIC8qCkBAIC0yMzYsNiArMjQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc3Vuc2FiX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgc3Vuc2FiX3R4X2lkbGUoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKik7CiAKIHN0YXRpYyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICp1cCwKIAkJCSAgIHVuaW9uIHNhYjgyNTMyX2lycV9zdGF0dXMgKnN0YXQpCkBAIC0yNTgsNiArMjY5LDcgQEAKIAkJcmV0dXJuOwogCiAJc2V0X2JpdChTQUI4MjUzMl9YUFIsICZ1cC0+aXJxZmxhZ3MpOworCXN1bnNhYl90eF9pZGxlKHVwKTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZ1cC0+cG9ydCkpIHsKIAkJdXAtPmludGVycnVwdF9tYXNrMSB8PSBTQUI4MjUzMl9JTVIxX1hQUjsKQEAgLTM5NywyMSArNDA5LDIxIEBACiAJc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICopIHBvcnQ7CiAKIAlpZiAobWN0cmwgJiBUSU9DTV9SVFMpIHsKLQkJd3JpdGViKHJlYWRiKCZ1cC0+cmVncy0+cncubW9kZSkgJiB+U0FCODI1MzJfTU9ERV9GUlRTLAotCQkgICAgICAgJnVwLT5yZWdzLT5ydy5tb2RlKTsKLQkJd3JpdGViKHJlYWRiKCZ1cC0+cmVncy0+cncubW9kZSkgfCBTQUI4MjUzMl9NT0RFX1JUUywKLQkJICAgICAgICZ1cC0+cmVncy0+cncubW9kZSk7CisJCXVwLT5jYWNoZWRfbW9kZSAmPSB+U0FCODI1MzJfTU9ERV9GUlRTOworCQl1cC0+Y2FjaGVkX21vZGUgfD0gU0FCODI1MzJfTU9ERV9SVFM7CiAJfSBlbHNlIHsKLQkJd3JpdGViKHJlYWRiKCZ1cC0+cmVncy0+cncubW9kZSkgfCBTQUI4MjUzMl9NT0RFX0ZSVFMsCi0JCSAgICAgICAmdXAtPnJlZ3MtPnJ3Lm1vZGUpOwotCQl3cml0ZWIocmVhZGIoJnVwLT5yZWdzLT5ydy5tb2RlKSB8IFNBQjgyNTMyX01PREVfUlRTLAotCQkgICAgICAgJnVwLT5yZWdzLT5ydy5tb2RlKTsKKwkJdXAtPmNhY2hlZF9tb2RlIHw9IChTQUI4MjUzMl9NT0RFX0ZSVFMgfAorCQkJCSAgICBTQUI4MjUzMl9NT0RFX1JUUyk7CiAJfQogCWlmIChtY3RybCAmIFRJT0NNX0RUUikgewotCQl3cml0ZWIocmVhZGIoJnVwLT5yZWdzLT5ydy5wdnIpICYgfih1cC0+cHZyX2R0cl9iaXQpLCAmdXAtPnJlZ3MtPnJ3LnB2cik7CisJCXVwLT5jYWNoZWRfcHZyICY9IH4odXAtPnB2cl9kdHJfYml0KTsKIAl9IGVsc2UgewotCQl3cml0ZWIocmVhZGIoJnVwLT5yZWdzLT5ydy5wdnIpIHwgdXAtPnB2cl9kdHJfYml0LCAmdXAtPnJlZ3MtPnJ3LnB2cik7CisJCXVwLT5jYWNoZWRfcHZyIHw9IHVwLT5wdnJfZHRyX2JpdDsKIAl9CisKKwlzZXRfYml0KFNBQjgyNTMyX1JFR1NfUEVORElORywgJnVwLT5pcnFmbGFncyk7CisJaWYgKHRlc3RfYml0KFNBQjgyNTMyX1hQUiwgJnVwLT5pcnFmbGFncykpCisJCXN1bnNhYl90eF9pZGxlKHVwKTsKIH0KIAogLyogcG9ydC0+bG9jayBpcyBub3QgaGVsZC4gICovCkBAIC00NTAsNiArNDYyLDI1IEBACiB9CiAKIC8qIHBvcnQtPmxvY2sgaGVsZCBieSBjYWxsZXIuICAqLworc3RhdGljIHZvaWQgc3Vuc2FiX3R4X2lkbGUoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwKQoreworCWlmICh0ZXN0X2JpdChTQUI4MjUzMl9SRUdTX1BFTkRJTkcsICZ1cC0+aXJxZmxhZ3MpKSB7CisJCXU4IHRtcDsKKworCQljbGVhcl9iaXQoU0FCODI1MzJfUkVHU19QRU5ESU5HLCAmdXAtPmlycWZsYWdzKTsKKwkJd3JpdGViKHVwLT5jYWNoZWRfbW9kZSwgJnVwLT5yZWdzLT5ydy5tb2RlKTsKKwkJd3JpdGViKHVwLT5jYWNoZWRfcHZyLCAmdXAtPnJlZ3MtPnJ3LnB2cik7CisJCXdyaXRlYih1cC0+Y2FjaGVkX2RhZm8sICZ1cC0+cmVncy0+dy5kYWZvKTsKKworCQl3cml0ZWIodXAtPmNhY2hlZF9lYnJnICYgMHhmZiwgJnVwLT5yZWdzLT53LmJncik7CisJCXRtcCA9IHJlYWRiKCZ1cC0+cmVncy0+cncuY2NyMik7CisJCXRtcCAmPSB+MHhjMDsKKwkJdG1wIHw9ICh1cC0+Y2FjaGVkX2VicmcgPj4gMikgJiAweGMwOworCQl3cml0ZWIodG1wLCAmdXAtPnJlZ3MtPnJ3LmNjcjIpOworCX0KK30KKworLyogcG9ydC0+bG9jayBoZWxkIGJ5IGNhbGxlci4gICovCiBzdGF0aWMgdm9pZCBzdW5zYWJfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKQEAgLTUxNywxMiArNTQ4LDE2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCi0JdmFsID0gcmVhZGIoJnVwLT5yZWdzLT5ydy5kYWZvKTsKKwl2YWwgPSB1cC0+Y2FjaGVkX2RhZm87CiAJaWYgKGJyZWFrX3N0YXRlKQogCQl2YWwgfD0gU0FCODI1MzJfREFGT19YQlJLOwogCWVsc2UKIAkJdmFsICY9IH5TQUI4MjUzMl9EQUZPX1hCUks7Ci0Jd3JpdGViKHZhbCwgJnVwLT5yZWdzLT5ydy5kYWZvKTsKKwl1cC0+Y2FjaGVkX2RhZm8gPSB2YWw7CisKKwlzZXRfYml0KFNBQjgyNTMyX1JFR1NfUEVORElORywgJnVwLT5pcnFmbGFncyk7CisJaWYgKHRlc3RfYml0KFNBQjgyNTMyX1hQUiwgJnVwLT5pcnFmbGFncykpCisJCXN1bnNhYl90eF9pZGxlKHVwKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KQEAgLTU2Niw4ICs2MDEsOSBAQAogCSAgICAgICBTQUI4MjUzMl9DQ1IyX1RPRSwgJnVwLT5yZWdzLT53LmNjcjIpOwogCXdyaXRlYigwLCAmdXAtPnJlZ3MtPncuY2NyMyk7CiAJd3JpdGViKFNBQjgyNTMyX0NDUjRfTUNLNCB8IFNBQjgyNTMyX0NDUjRfRUJSRywgJnVwLT5yZWdzLT53LmNjcjQpOwotCXdyaXRlYihTQUI4MjUzMl9NT0RFX1JUUyB8IFNBQjgyNTMyX01PREVfRkNUUyB8Ci0JICAgICAgIFNBQjgyNTMyX01PREVfUkFDLCAmdXAtPnJlZ3MtPncubW9kZSk7CisJdXAtPmNhY2hlZF9tb2RlID0gKFNBQjgyNTMyX01PREVfUlRTIHwgU0FCODI1MzJfTU9ERV9GQ1RTIHwKKwkJCSAgIFNBQjgyNTMyX01PREVfUkFDKTsKKwl3cml0ZWIodXAtPmNhY2hlZF9tb2RlLCAmdXAtPnJlZ3MtPncubW9kZSk7CiAJd3JpdGViKFNBQjgyNTMyX1JGQ19EUFN8U0FCODI1MzJfUkZDX1JGVEhfMzIsICZ1cC0+cmVncy0+dy5yZmMpOwogCQogCXRtcCA9IHJlYWRiKCZ1cC0+cmVncy0+cncuY2NyMCk7CkBAIC01OTgsNyArNjM0LDYgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgdG1wOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIApAQCAtNjA5LDE0ICs2NDQsMTMgQEAKIAl3cml0ZWIodXAtPmludGVycnVwdF9tYXNrMSwgJnVwLT5yZWdzLT53LmltcjEpOwogCiAJLyogRGlzYWJsZSBicmVhayBjb25kaXRpb24gKi8KLQl0bXAgPSByZWFkYigmdXAtPnJlZ3MtPnJ3LmRhZm8pOwotCXRtcCAmPSB+U0FCODI1MzJfREFGT19YQlJLOwotCXdyaXRlYih0bXAsICZ1cC0+cmVncy0+cncuZGFmbyk7CisJdXAtPmNhY2hlZF9kYWZvID0gcmVhZGIoJnVwLT5yZWdzLT5ydy5kYWZvKTsKKwl1cC0+Y2FjaGVkX2RhZm8gJj0gflNBQjgyNTMyX0RBRk9fWEJSSzsKKwl3cml0ZWIodXAtPmNhY2hlZF9kYWZvLCAmdXAtPnJlZ3MtPnJ3LmRhZm8pOwogCiAJLyogRGlzYWJsZSBSZWNlaXZlciAqLwkKLQl0bXAgPSByZWFkYigmdXAtPnJlZ3MtPnJ3Lm1vZGUpOwotCXRtcCAmPSB+U0FCODI1MzJfTU9ERV9SQUM7Ci0Jd3JpdGViKHRtcCwgJnVwLT5yZWdzLT5ydy5tb2RlKTsKKwl1cC0+Y2FjaGVkX21vZGUgJj0gflNBQjgyNTMyX01PREVfUkFDOworCXdyaXRlYih1cC0+Y2FjaGVkX21vZGUsICZ1cC0+cmVncy0+cncubW9kZSk7CiAKIAkvKgogCSAqIFhYWCBGSVhNRQpAQCAtNjg1LDcgKzcxOSw2IEBACiAJCQkJICB1bnNpZ25lZCBpbnQgaWZsYWcsIHVuc2lnbmVkIGludCBiYXVkLAogCQkJCSAgdW5zaWduZWQgaW50IHF1b3QpCiB7Ci0JdW5zaWduZWQgaW50IGVicmc7CiAJdW5zaWduZWQgY2hhciBkYWZvOwogCWludCBiaXRzLCBuLCBtOwogCkBAIC03MTQsMTAgKzc0NywxMSBAQAogCX0gZWxzZSB7CiAJCWRhZm8gfD0gU0FCODI1MzJfREFGT19QQVJfRVZFTjsKIAl9CisJdXAtPmNhY2hlZF9kYWZvID0gZGFmbzsKIAogCWNhbGNfZWJyZyhiYXVkLCAmbiwgJm0pOwogCi0JZWJyZyA9IG4gfCAobSA8PCA2KTsKKwl1cC0+Y2FjaGVkX2VicmcgPSBuIHwgKG0gPDwgNik7CiAKIAl1cC0+dGVjX3RpbWVvdXQgPSAoMTAgKiAxMDAwMDAwKSAvIGJhdWQ7CiAJdXAtPmNlY190aW1lb3V0ID0gdXAtPnRlY190aW1lb3V0ID4+IDI7CkBAIC03NzAsMTYgKzgwNCwxMyBAQAogCXVhcnRfdXBkYXRlX3RpbWVvdXQoJnVwLT5wb3J0LCBjZmxhZywKIAkJCSAgICAodXAtPnBvcnQudWFydGNsayAvICgxNiAqIHF1b3QpKSk7CiAKLQkvKiBOb3cgYmFuZyB0aGUgbmV3IHNldHRpbmdzIGludG8gdGhlIGNoaXAuICAqLwotCXN1bnNhYl9jZWNfd2FpdCh1cCk7Ci0Jc3Vuc2FiX3RlY193YWl0KHVwKTsKLQl3cml0ZWIoZGFmbywgJnVwLT5yZWdzLT53LmRhZm8pOwotCXdyaXRlYihlYnJnICYgMHhmZiwgJnVwLT5yZWdzLT53LmJncik7Ci0Jd3JpdGViKChyZWFkYigmdXAtPnJlZ3MtPnJ3LmNjcjIpICYgfjB4YzApIHwgKChlYnJnID4+IDIpICYgMHhjMCksCi0JICAgICAgICZ1cC0+cmVncy0+cncuY2NyMik7Ci0KLQl3cml0ZWIocmVhZGIoJnVwLT5yZWdzLT5ydy5tb2RlKSB8IFNBQjgyNTMyX01PREVfUkFDLCAmdXAtPnJlZ3MtPnJ3Lm1vZGUpOwotCisJLyogTm93IHNjaGVkdWxlIGEgcmVnaXN0ZXIgdXBkYXRlIHdoZW4gdGhlIGNoaXAncworCSAqIHRyYW5zbWl0dGVyIGlzIGlkbGUuCisJICovCisJdXAtPmNhY2hlZF9tb2RlIHw9IFNBQjgyNTMyX01PREVfUkFDOworCXNldF9iaXQoU0FCODI1MzJfUkVHU19QRU5ESU5HLCAmdXAtPmlycWZsYWdzKTsKKwlpZiAodGVzdF9iaXQoU0FCODI1MzJfWFBSLCAmdXAtPmlycWZsYWdzKSkKKwkJc3Vuc2FiX3R4X2lkbGUodXApOwogfQogCiAvKiBwb3J0LT5sb2NrIGlzIG5vdCBoZWxkLiAgKi8KQEAgLTEwODQsMTEgKzExMTUsMTMgQEAKIAkJCXVwLT5wdnJfZHNyX2JpdCA9ICgxIDw8IDMpOwogCQkJdXAtPnB2cl9kdHJfYml0ID0gKDEgPDwgMik7CiAJCX0KLQkJd3JpdGViKCgxIDw8IDEpIHwgKDEgPDwgMikgfCAoMSA8PCA0KSwgJnVwLT5yZWdzLT53LnB2cik7Ci0JCXdyaXRlYihyZWFkYigmdXAtPnJlZ3MtPnJ3Lm1vZGUpIHwgU0FCODI1MzJfTU9ERV9GUlRTLAotCQkgICAgICAgJnVwLT5yZWdzLT5ydy5tb2RlKTsKLQkJd3JpdGViKHJlYWRiKCZ1cC0+cmVncy0+cncubW9kZSkgfCBTQUI4MjUzMl9NT0RFX1JUUywKLQkJICAgICAgICZ1cC0+cmVncy0+cncubW9kZSk7CisJCXVwLT5jYWNoZWRfcHZyID0gKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICgxIDw8IDQpOworCQl3cml0ZWIodXAtPmNhY2hlZF9wdnIsICZ1cC0+cmVncy0+dy5wdnIpOworCQl1cC0+Y2FjaGVkX21vZGUgPSByZWFkYigmdXAtPnJlZ3MtPnJ3Lm1vZGUpOworCQl1cC0+Y2FjaGVkX21vZGUgfD0gU0FCODI1MzJfTU9ERV9GUlRTOworCQl3cml0ZWIodXAtPmNhY2hlZF9tb2RlLCAmdXAtPnJlZ3MtPnJ3Lm1vZGUpOworCQl1cC0+Y2FjaGVkX21vZGUgfD0gU0FCODI1MzJfTU9ERV9SVFM7CisJCXdyaXRlYih1cC0+Y2FjaGVkX21vZGUsICZ1cC0+cmVncy0+cncubW9kZSk7CiAKIAkJdXAtPnRlY190aW1lb3V0ID0gU0FCODI1MzJfTUFYX1RFQ19USU1FT1VUOwogCQl1cC0+Y2VjX3RpbWVvdXQgPSBTQUI4MjUzMl9NQVhfQ0VDX1RJTUVPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuaCBiL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5oCmluZGV4IDY4NjA4NmYuLmI3OGUxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5oCkBAIC0xMjYsNiArMTI2LDcgQEAKIC8qIGlycWZsYWdzIGJpdHMgKi8KICNkZWZpbmUgU0FCODI1MzJfQUxMUwkJCTB4MDAwMDAwMDEKICNkZWZpbmUgU0FCODI1MzJfWFBSCQkJMHgwMDAwMDAwMgorI2RlZmluZSBTQUI4MjUzMl9SRUdTX1BFTkRJTkcJCTB4MDAwMDAwMDQKIAogLyogUkZJRk8gU3RhdHVzIEJ5dGUgKi8KICNkZWZpbmUgU0FCODI1MzJfUlNUQVRfUEUJCTB4ODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYyBiL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYwppbmRleCAzMDc4ODYxLi41ZDJjZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC92cjQxeHhfc2l1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdnI0MXh4X3NpdS5jCkBAIC00MTIsMTAgKzQxMiw4IEBACiAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gsIHJlZ3MpKQogCQkJZ290byBpZ25vcmVfY2hhcjsKLQkJaWYgKChsc3IgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJaWYgKChsc3IgJiBVQVJUX0xTUl9PRSkgJiYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpKQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisKKwkJdWFydF9pbnNlcnRfY2hhcihwb3J0LCBsc3IsIFVBUlRfTFNSX09FLCBjaCwgZmxhZyk7CiAKIAlpZ25vcmVfY2hhcjoKIAkJbHNyID0gc2l1X3JlYWQocG9ydCwgVUFSVF9MU1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwppbmRleCAyMzNmOTIyLi4yYTE2OTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYworKysgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwpAQCAtMzg2LDYgKzM4Niw4IEBACiAJCWlmIChpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgIT0gQVRNX1BIWV9TSUdfTE9TVCkgewogCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiQURTTCBsaW5lIGlzIGRvd25cbiIpOworCQkJLyogSXQnbGwgbmV2ZXIgcmVzeW5jIGFnYWluIHVubGVzcyB3ZSBhc2sgaXQgdG8uLi4gKi8KKwkJCXNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oaW5zdGFuY2UpOwogCQl9CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggZWM5YjNiZC4uNGFiNTAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtMjg2LDYgKzI4NiwzOSBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JUlVHTywgc2hvd19pbnRlcmZhY2Vfc3RyaW5nLCBOVUxMKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKworCWludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaWYgKHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzID09IDApIHsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidXNiOnYlMDRYcCUwNFhkJTA0WGRjJTAyWGRzYyUwMlhkcCUwMlhpYyUwMlhpc2MlMDJYaXAlMDJYXG4iLAorCQkJICAgICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJICAgICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJCSAgICAgICBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSksCisJCQkgICAgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MsCisJCQkgICAgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlU3ViQ2xhc3MsCisJCQkgICAgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlUHJvdG9jb2wsCisJCQkgICAgICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VDbGFzcywKKwkJCSAgICAgICBhbHQtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzLAorCQkJICAgICAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wpOworIAl9IGVsc2UgeworCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1c2I6diUwNFhwJTA0WGQlMDRYZGMlMDJYZHNjJTAyWGRwJTAyWGljKmlzYyppcCpcbiIsCisJCQkgICAgICAgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQkgICAgICAgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJICAgICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSwKKwkJCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcywKKwkJCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VTdWJDbGFzcywKKwkJCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCk7CisJfQorCit9CitzdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIFNfSVJVR08sIHNob3dfbW9kYWxpYXMsIE5VTEwpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50Zl9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9iSW50ZXJmYWNlTnVtYmVyLmF0dHIsCiAJJmRldl9hdHRyX2JBbHRlcm5hdGVTZXR0aW5nLmF0dHIsCkBAIC0yOTMsNiArMzI2LDcgQEAKIAkmZGV2X2F0dHJfYkludGVyZmFjZUNsYXNzLmF0dHIsCiAJJmRldl9hdHRyX2JJbnRlcmZhY2VTdWJDbGFzcy5hdHRyLAogCSZkZXZfYXR0cl9iSW50ZXJmYWNlUHJvdG9jb2wuYXR0ciwKKwkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKIAlOVUxMLAogfTsKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGZfYXR0cl9ncnAgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKaW5kZXggMDJmZWZhYi4uNDI5MzMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwpAQCAtNzIsNiArNzIsNyBAQAogCX0KIAogCS8qIHR1cm4gb2ZmIG5vdy1pZGxlIEhDICovCisJZGVsX3RpbWVyX3N5bmMgKCZlaGNpLT53YXRjaGRvZyk7CiAJZWhjaV9oYWx0IChlaGNpKTsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnCmluZGV4IGRiNjRjOTAuLmIxMDQ0MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnCkBAIC0yMTksMTcgKzIxOSwyMSBAQAogCSAgYnkgc29tZSBzYW1wbGUgZmlybXdhcmUgZnJvbSBFcHNvbi4KIAogY29uZmlnIFVTQl9aQVVSVVMKLQlib29sZWFuICJTaGFycCBaYXVydXMgKHN0b2NrIFJPTXMpIgorCWJvb2xlYW4gIlNoYXJwIFphdXJ1cyAoc3RvY2sgUk9NcykgYW5kIGNvbXBhdGlibGUiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUCiAJc2VsZWN0IENSQzMyCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgdGhlIHVzYiBuZXR3b3JraW5nIGxpbmtzIHVzZWQgYnkKIAkgIFphdXJ1cyBtb2RlbHMgbGlrZSB0aGUgU0wtNTAwMEQsIFNMLTU1MDAsIFNMLTU2MDAsIEEtMzAwLCBCLTUwMC4KKwkgIFRoaXMgYWxzbyBzdXBwb3J0cyBzb21lIHJlbGF0ZWQgZGV2aWNlIGZpcm13YXJlLCBhcyB1c2VkIGluIHNvbWUKKwkgIFBEQXMgZnJvbSBPbHltcHVzIGFuZCBzb21lIGNlbGwgcGhvbmVzIGZyb20gTW90b3JvbGEuCiAKLQkgIElmIHlvdSBpbnN0YWxsIGFuIGFsdGVybmF0ZSBST00gaW1hZ2UsIHlvdSBtYXkgbm8gbG9uZ2VyIG5lZWQKLQkgIHRvIHN1cHBvcnQgdGhpcyBwcm90b2NvbC4gIE9ubHkgdGhlICJldGgtZmQiIGRyaXZlciByZWFsbHkgbmVlZHMKLQkgIHRoaXMgbm9uLWNvbmZvcm1hbnQgdmFyaWFudCBvZiBDREMgRXRoZXJuZXQgcHJvdG9jb2wuCisJICBJZiB5b3UgaW5zdGFsbCBhbiBhbHRlcm5hdGUgUk9NIGltYWdlLCBzdWNoIGFzIHRoZSBMaW51eCAyLjYgYmFzZWQKKwkgIHZlcnNpb25zIG9mIE9wZW5aYXVydXMsIHlvdSBzaG91bGQgbm8gbG9uZ2VyIG5lZWQgdG8gc3VwcG9ydCB0aGlzCisJICBwcm90b2NvbC4gIE9ubHkgdGhlICJldGgtZmQiIG9yICJuZXRfZmQiIGRyaXZlcnMgaW4gdGhlc2UgZGV2aWNlcworCSAgcmVhbGx5IG5lZWQgdGhpcyBub24tY29uZm9ybWFudCB2YXJpYW50IG9mIENEQyBFdGhlcm5ldCAob3IgaW4KKwkgIHNvbWUgY2FzZXMgQ0RDIE1ETE0pIHByb3RvY29sLCBub3QgImdfZXRoZXIiLgogCiBjb25maWcgVVNCX0NEQ0VUSEVSCiAJYm9vbGVhbiAiQ0RDIEV0aGVybmV0IHN1cHBvcnQgKHNtYXJ0IGRldmljZXMgc3VjaCBhcyBjYWJsZSBtb2RlbXMpIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCmluZGV4IGY2YmM2YjMuLjg1NDc2ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKQEAgLTE1MTcsNiArMTUxNywyNiBAQAogCX0KIH0KIAorI2VuZGlmCS8qIE5FRURfR0VORVJJQ19DREMgKi8KKworDAorI2lmZGVmCUNPTkZJR19VU0JfQ0RDRVRIRVIKKyNkZWZpbmUJSEFWRV9IQVJEV0FSRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb21tdW5pY2F0aW9ucyBEZXZpY2UgQ2xhc3MsIEV0aGVybmV0IENvbnRyb2wgbW9kZWwKKyAqCisgKiBUYWtlcyB0d28gaW50ZXJmYWNlcy4gIFRoZSBEQVRBIGludGVyZmFjZSBpcyBpbmFjdGl2ZSB0aWxsIGFuIGFsdHNldHRpbmcKKyAqIGlzIHNlbGVjdGVkLiAgQ29uZmlndXJhdGlvbiBkYXRhIGluY2x1ZGVzIGNsYXNzIGRlc2NyaXB0b3JzLgorICoKKyAqIFRoaXMgc2hvdWxkIGludGVyb3Agd2l0aCB3aGF0ZXZlciB0aGUgMi40ICJDRENFdGhlci5jIiBkcml2ZXIKKyAqIChieSBCcmFkIEhhcmRzKSB0YWxrZWQgd2l0aC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKwogCiBzdGF0aWMgdm9pZCBkdW1wc3BlZWQgKHN0cnVjdCB1c2JuZXQgKmRldiwgX19sZTMyICpzcGVlZHMpCiB7CkBAIC0xNTY3LDI2ICsxNTg3LDYgQEAKIAl9CiB9CiAKLSNlbmRpZgkvKiBORUVEX0dFTkVSSUNfQ0RDICovCi0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0NEQ0VUSEVSCi0jZGVmaW5lCUhBVkVfSEFSRFdBUkUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogQ29tbXVuaWNhdGlvbnMgRGV2aWNlIENsYXNzLCBFdGhlcm5ldCBDb250cm9sIG1vZGVsCi0gKiAKLSAqIFRha2VzIHR3byBpbnRlcmZhY2VzLiAgVGhlIERBVEEgaW50ZXJmYWNlIGlzIGluYWN0aXZlIHRpbGwgYW4gYWx0c2V0dGluZwotICogaXMgc2VsZWN0ZWQuICBDb25maWd1cmF0aW9uIGRhdGEgaW5jbHVkZXMgY2xhc3MgZGVzY3JpcHRvcnMuCi0gKgotICogVGhpcyBzaG91bGQgaW50ZXJvcCB3aXRoIHdoYXRldmVyIHRoZSAyLjQgIkNEQ0V0aGVyLmMiIGRyaXZlcgotICogKGJ5IEJyYWQgSGFyZHMpIHRhbGtlZCB3aXRoLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotCiBzdGF0aWMgdTggbmliYmxlICh1bnNpZ25lZCBjaGFyIGMpCiB7CiAJaWYgKGxpa2VseSAoaXNkaWdpdCAoYykpKQpAQCAtMjc2NSw3ICsyNzY1LDcgQEAKIAkJCX0KIAkJCS8qIGV4cGVjdCBiY2RWZXJzaW9uIDEuMCwgaWdub3JlICovCiAJCQlpZiAobWVtY21wKCZkZXNjLT5iR1VJRCwgYmxhbl9ndWlkLCAxNikKLQkJCQkgICAgfHwgbWVtY21wKCZkZXNjLT5iR1VJRCwgYmxhbl9ndWlkLCAxNikgKSB7CisJCQkJICAgICYmIG1lbWNtcCgmZGVzYy0+YkdVSUQsIGJsYW5fZ3VpZCwgMTYpICkgewogCQkJCS8qIGhleSwgdGhpcyBvbmUgbWlnaHQgX3JlYWxseV8gYmUgTURMTSEgKi8KIAkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LCAiTURMTSBndWlkXG4iKTsKIAkJCQlnb3RvIGJhZF9kZXNjOwpAQCAtMjc5NywxMSArMjc5NywxMyBAQAogCQkJICogIC0gYlBhZCAoaWdub3JlZCwgZm9yIFBBREFGVEVSIC0tIEJMQU4tb25seSkKIAkJCSAqIGJpdHMgYXJlOgogCQkJICogIC0gMHgwMSAtLSBaYXVydXMgZnJhbWluZyAoYWRkIENSQykKLQkJCSAqICAtIDB4MDIgLS0gUEFEQkVGT1JFCi0JCQkgKiAgLSAweDA0IC0tIFBBREFGVEVSCisJCQkgKiAgLSAweDAyIC0tIFBBREJFRk9SRSAoQ1JDIGluY2x1ZGVzIHNvbWUgcGFkZGluZykKKwkJCSAqICAtIDB4MDQgLS0gUEFEQUZURVIgKHNvbWUgcGFkZGluZyBhZnRlciBDUkMpCiAJCQkgKiAgLSAweDA4IC0tICJmZXJtYXQiIHBhY2tldCBtYW5nbGluZyAoZm9yIGh3IGJ1Z3MpCisJCQkgKiB0aGUgUEFEQkVGT1JFIGFwcGVhcnMgbm90IHRvIG1hdHRlcjsgd2UgaW50ZXJvcAorCQkJICogd2l0aCBkZXZpY2VzIHRoYXQgdXNlIGl0IGFuZCB0aG9zZSB0aGF0IGRvbid0LgogCQkJICovCi0JCQlpZiAoZGV0YWlsLT5iRGV0YWlsRGF0YVsxXSAhPSAweDAxKSB7CisJCQlpZiAoKGRldGFpbC0+YkRldGFpbERhdGFbMV0gJiB+MDIpICE9IDB4MDEpIHsKIAkJCQkvKiBibURhdGFDYXBhYmlsaXRlcyA9PSAwIHdvdWxkIGJlIGZpbmUgdG9vLAogCQkJCSAqIGJ1dCBmcmFtaW5nIGlzIG1pbmlkcml2ZXItY291cGxlZCBmb3Igbm93LgogCQkJCSAqLwpAQCAtNDA3MSw5ICs0MDczLDYgQEAKIAlVU0JfREVWSUNFICgweDgwODYsIDB4MDdkMyksCS8vICJibG9iIiBib290bG9hZGVyCiAJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZibG9iX2luZm8sCiB9LCB7Ci0JVVNCX0RFVklDRSAoMHgyMmI4LCAweDYwMGMpLAkvLyBVU0JORVQgTW90b3JvbGEgRTY4MAotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmbGludXhkZXZfaW5mbywKLX0sIHsKIAkvLyBMaW51eCBFdGhlcm5ldC9STkRJUyBnYWRnZXQgb24gcHhhMjEwLzI1eC8yNngKIAkvLyBlLmcuIEd1bXN0aXgsIGN1cnJlbnQgT3BlblphdXJ1cywgLi4uCiAJVVNCX0RFVklDRV9WRVIgKDB4MDUyNSwgMHhhNGEyLCAweDAyMDMsIDB4MDIwMyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwppbmRleCBmMzRhOWJiLi4wMTJlNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKQEAgLTg5LDYgKzg5LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX2VhcnRobWF0ZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVkVORE9SX0lEX0RFTE9STUUsIFBST0RVQ1RfSURfRUFSVEhNQVRFVVNCKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfSURfREVMT1JNRSwgUFJPRFVDVF9JRF9FQVJUSE1BVEVVU0JfTFQyMCkgfSwKIAl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtOTksNiArMTAwLDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX2NvbWJpbmVkIFtdID0gewogCXsgVVNCX0RFVklDRShWRU5ET1JfSURfREVMT1JNRSwgUFJPRFVDVF9JRF9FQVJUSE1BVEVVU0IpIH0sCisJeyBVU0JfREVWSUNFKFZFTkRPUl9JRF9ERUxPUk1FLCBQUk9EVUNUX0lEX0VBUlRITUFURVVTQl9MVDIwKSB9LAogCXsgVVNCX0RFVklDRShWRU5ET1JfSURfQ1lQUkVTUywgUFJPRFVDVF9JRF9DWVBISURDT00pIH0sCiAJeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguaAppbmRleCAxMDEyZWU2Li4xZmExMTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmgKQEAgLTEzLDYgKzEzLDcgQEAKIC8qIERlTG9ybWUgRWFydGhtYXRlIFVTQiAtIGEgR1BTIGRldmljZSAqLwogI2RlZmluZQlWRU5ET1JfSURfREVMT1JNRQkJIDB4MTE2MwogI2RlZmluZSBQUk9EVUNUX0lEX0VBUlRITUFURVVTQgkJIDB4MDEwMAorI2RlZmluZSBQUk9EVUNUX0lEX0VBUlRITUFURVVTQl9MVDIwCSAweDAyMDAKIAogLyogQ3lwcmVzcyBISUQtPkNPTSBSUzIzMiBBZGFwdGVyICovCiAjZGVmaW5lIFZFTkRPUl9JRF9DWVBSRVNTCQkgMHgwNGI0CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggY2U5NDIzYi4uYzM3NGJlNSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJfQogCiAJLyogUG9wdWxhdGUgYXJndiBhbmQgZW52cCAqLwotCXAgPSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OworCXAgPSBjdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5hcmdfc3RhcnQ7CiAJd2hpbGUgKGFyZ2MtLSA+IDApIHsKIAkJc2l6ZV90IGxlbjsKIAkJX19wdXRfdXNlcigoZWxmX2FkZHJfdClwLCBhcmd2KyspOwpAQCAtMTMwMSw3ICsxMzAxLDcgQEAKIHN0YXRpYyBpbnQgZmlsbF9wc2luZm8oc3RydWN0IGVsZl9wcnBzaW5mbyAqcHNpbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlpbnQgaSwgbGVuOworCXVuc2lnbmVkIGludCBpLCBsZW47CiAJCiAJLyogZmlyc3QgY29weSB0aGUgcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgKi8KIAltZW1zZXQocHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbykpOwpkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCA2Zjg4ZGNjLi43ZTllNDA5IDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMjA5NCw5ICsyMDk0LDEyIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQlpbnQgZXJyID0gMDsKKwogCQkJZnVsbHlfbWFwcGVkID0gMDsKIAkJCWlmIChpYmxvY2sgPCBsYmxvY2spIHsKLQkJCQlpZiAoZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoLCAwKSkKKwkJCQllcnIgPSBnZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQkJCWlmIChlcnIpCiAJCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJCX0KIAkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKQEAgLTIxMDQsNyArMjEwNyw4IEBACiAJCQkJbWVtc2V0KGthZGRyICsgaSAqIGJsb2Nrc2l6ZSwgMCwgYmxvY2tzaXplKTsKIAkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJaWYgKCFlcnIpCisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJLyoKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwppbmRleCA1NDViNDQwLi45ODFjY2IyIDEwMDY0NAotLS0gYS9mcy9leHQzL3N1cGVyLmMKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC0yMjUsOCArMjI1LDE2IEBACiAJCSAgICAgICBpbnQgZXJybm8pCiB7CiAJY2hhciBuYnVmWzE2XTsKLQljb25zdCBjaGFyICplcnJzdHIgPSBleHQzX2RlY29kZV9lcnJvcihzYiwgZXJybm8sIG5idWYpOworCWNvbnN0IGNoYXIgKmVycnN0cjsKIAorCS8qIFNwZWNpYWwgY2FzZTogaWYgdGhlIGVycm9yIGlzIEVST0ZTLCBhbmQgd2UncmUgbm90IGFscmVhZHkKKwkgKiBpbnNpZGUgYSB0cmFuc2FjdGlvbiwgdGhlbiB0aGVyZSdzIHJlYWxseSBubyBwb2ludCBpbiBsb2dnaW5nCisJICogYW4gZXJyb3IuICovCisJaWYgKGVycm5vID09IC1FUk9GUyAmJiBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgPT0gTlVMTCAmJgorCSAgICAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm47CisKKwllcnJzdHIgPSBleHQzX2RlY29kZV9lcnJvcihzYiwgZXJybm8sIG5idWYpOwogCXByaW50ayAoS0VSTl9DUklUICJFWFQzLWZzIGVycm9yIChkZXZpY2UgJXMpIGluICVzOiAlc1xuIiwKIAkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJzdHIpOwogCmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBkZWZlNjc4Li5kZDc4ZjAxIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTE1ODAsNiArMTU4MCw3IEBACiBmYWlsOgogCXJldHVybiBkZW50cnk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfY3JlYXRlKTsKIAogaW50IHZmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgZGV2KQogewpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9tbXUuYyBiL2ZzL3Byb2MvbW11LmMKaW5kZXggYTcwNDEwMy4uMjVkMmQ5YyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9tbXUuYworKysgYi9mcy9wcm9jL21tdS5jCkBAIC01MCwxMyArNTAsMjMgQEAKIAkJcmVhZF9sb2NrKCZ2bWxpc3RfbG9jayk7CiAKIAkJZm9yICh2bWEgPSB2bWxpc3Q7IHZtYTsgdm1hID0gdm1hLT5uZXh0KSB7CisJCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgdm1hLT5hZGRyOworCisJCQkvKgorCQkJICogU29tZSBhcmNocyBrZWVwIGFub3RoZXIgcmFuZ2UgZm9yIG1vZHVsZXMgaW4gdm1saXN0CisJCQkgKi8KKwkJCWlmIChhZGRyIDwgVk1BTExPQ19TVEFSVCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhZGRyID49IFZNQUxMT0NfRU5EKQorCQkJCWJyZWFrOworCiAJCQl2bWktPnVzZWQgKz0gdm1hLT5zaXplOwogCi0JCQlmcmVlX2FyZWFfc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSB2bWEtPmFkZHIgLSBwcmV2X2VuZDsKKwkJCWZyZWVfYXJlYV9zaXplID0gYWRkciAtIHByZXZfZW5kOwogCQkJaWYgKHZtaS0+bGFyZ2VzdF9jaHVuayA8IGZyZWVfYXJlYV9zaXplKQogCQkJCXZtaS0+bGFyZ2VzdF9jaHVuayA9IGZyZWVfYXJlYV9zaXplOwogCi0JCQlwcmV2X2VuZCA9IHZtYS0+c2l6ZSArICh1bnNpZ25lZCBsb25nKSB2bWEtPmFkZHI7CisJCQlwcmV2X2VuZCA9IHZtYS0+c2l6ZSArIGFkZHI7CiAJCX0KIAogCQlpZiAoVk1BTExPQ19FTkQgLSBwcmV2X2VuZCA+IHZtaS0+bGFyZ2VzdF9jaHVuaykKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMgYi9mcy9yZWlzZXJmcy9zdHJlZS5jCmluZGV4IGRhMjNiYTcuLmM0N2Y4ZmQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMKKysrIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpAQCAtMjMwLDcgKzIzMCw2IEBACiAJX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKX0sfQogfTsKIAotY29uc3Qgc3RydWN0IGluX2NvcmVfa2V5ICBNQVhfSU5fQ09SRV9LRVkgPSB7fjBVLCB+MFUsIH4wVUxMPj40LCAxNX07CiAKIC8qIEdldCBkZWxpbWl0aW5nIGtleSBvZiB0aGUgYnVmZmVyIGJ5IGxvb2tpbmcgZm9yIGl0IGluIHRoZSBidWZmZXJzIGluIHRoZSBwYXRoLCBzdGFydGluZyBmcm9tIHRoZSBib3R0b20KICAgIG9mIHRoZSBwYXRoLCBhbmQgZ29pbmcgdXB3YXJkcy4gIFdlIG11c3QgY2hlY2sgdGhlIHBhdGgncyB2YWxpZGl0eSBhdCBlYWNoIHN0ZXAuICBJZiB0aGUga2V5IGlzIG5vdCBpbgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggMzFlNzUxMi4uYjM1Yjg3NyAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0xNjQsNyArMTY0LDkgQEAKICAKICAgICAvKiBjb21wb3NlIGtleSB0byBsb29rIGZvciAic2F2ZSIgbGlua3MgKi8KICAgICBtYXhfY3B1X2tleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7Ci0gICAgbWF4X2NwdV9rZXkub25fZGlza19rZXkgPSBNQVhfSU5fQ09SRV9LRVk7CisgICAgbWF4X2NwdV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSB+MFU7CisgICAgbWF4X2NwdV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IH4wVTsKKyAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJm1heF9jcHVfa2V5LCB+MFUpOwogICAgIG1heF9jcHVfa2V5LmtleV9sZW5ndGggPSAzOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvaW14LXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXgtcmVncy5oCmluZGV4IGYzMmMyMDMuLjkzYjg0MGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXgtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXgtcmVncy5oCkBAIC0yMjgsNiArMjI4LDMwIEBACiAjZGVmaW5lIFBEMzFfQklOX1NQSTJfVFhEICAgICggR1BJT19QT1JURCB8IEdQSU9fQklOIHwgMzEgKQogCiAvKgorICogUFdNIGNvbnRyb2xsZXIKKyAqLworI2RlZmluZSBQV01DCV9fUkVHKElNWF9QV01fQkFTRSArIDB4MDApCS8qIFBXTSBDb250cm9sIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQV01TCV9fUkVHKElNWF9QV01fQkFTRSArIDB4MDQpCS8qIFBXTSBTYW1wbGUgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBXTVAJX19SRUcoSU1YX1BXTV9CQVNFICsgMHgwOCkJLyogUFdNIFBlcmlvZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUFdNQ05UCV9fUkVHKElNWF9QV01fQkFTRSArIDB4MEMpCS8qIFBXTSBDb3VudGVyIFJlZ2lzdGVyCQkqLworCisjZGVmaW5lIFBXTUNfSENUUgkJKDB4MDE8PDE4KQkJLyogSGFsZndvcmQgRklGTyBEYXRhIFN3YXBwaW5nCSovCisjZGVmaW5lIFBXTUNfQkNUUgkJKDB4MDE8PDE3KQkJLyogQnl0ZSBGSUZPIERhdGEgU3dhcHBpbmcJKi8KKyNkZWZpbmUgUFdNQ19TV1IJCSgweDAxPDwxNikJCS8qIFNvZnR3YXJlIFJlc2V0CQkqLworI2RlZmluZSBQV01DX0NMS1NSQwkJKDB4MDE8PDE1KQkJLyogQ2xvY2sgU291cmNlCQkJKi8KKyNkZWZpbmUgUFdNQ19QUkVTQ0FMRVIoeCkJKCgoeC0xKSAmIDB4N0YpIDw8IDgpCS8qIFBSRVNDQUxFUgkJCSovCisjZGVmaW5lIFBXTUNfSVJRCQkoMHgwMTw8IDcpCQkvKiBJbnRlcnJ1cHQgUmVxdWVzdAkJKi8KKyNkZWZpbmUgUFdNQ19JUlFFTgkJKDB4MDE8PCA2KQkJLyogSW50ZXJydXB0IFJlcXVlc3QgRW5hYmxlCSovCisjZGVmaW5lIFBXTUNfRklGT0FWCQkoMHgwMTw8IDUpCQkvKiBGSUZPIEF2YWlsYWJsZQkJKi8KKyNkZWZpbmUgUFdNQ19FTgkJCSgweDAxPDwgNCkJCS8qIEVuYWJsZXMvRGlzYWJsZXMgdGhlIFBXTQkqLworI2RlZmluZSBQV01DX1JFUEVBVCh4KQkJKCgoeCkgJiAweDAzKSA8PCAyKQkvKiBTYW1wbGUgUmVwZWF0cwkJKi8KKyNkZWZpbmUgUFdNQ19DTEtTRUwoeCkJCSgoKHgpICYgMHgwMykgPDwgMCkJLyogQ2xvY2sgU2VsZWN0aW9uCQkqLworCisjZGVmaW5lIFBXTVNfU0FNUExFKHgpCQkoKHgpICYgMHhGRkZGKQkJLyogQ29udGFpbnMgYSB0d28tc2FtcGxlIHdvcmQJKi8KKyNkZWZpbmUgUFdNUF9QRVJJT0QoeCkJCSgoeCkgJiAweEZGRkYpCQkvKiBSZXByZXNlbnRzIHRoZSBQV00ncyBwZXJpb2QJKi8KKyNkZWZpbmUgUFdNQ19DT1VOVEVSKHgpCQkoKHgpICYgMHhGRkZGKQkJLyogUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb3VudCB2YWx1ZQkqLworCisvKgogICogIERNQSBDb250cm9sbGVyCiAgKi8KICNkZWZpbmUgRENSICAgICBfX1JFRyhJTVhfRE1BQ19CQVNFICsweDAwKQkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLW5hbmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1uYW5kLmgKaW5kZXggYzQ0M2FjOC4uN2NmZjIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLW5hbmQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbmFuZC5oCkBAIC0xLDE2ICsxLDE3IEBACiAvKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbmFuZC5oCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzIDxsaW51eEBzaW10ZWMuY28udWs+CiAgKgkJICAgICAgaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFMzQzI0MTAgY2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqIFMzQzI0MTAgTkFORCByZWdpc3RlciBkZWZpbml0aW9ucwogICoKICAqICBDaGFuZ2Vsb2c6CiAgKiAgICAxOC1BdWctMjAwNCAgICBCSkQgICAgIENvcGllZCBmaWxlIGZyb20gMi40IGFuZCB1cGRhdGVkCisgKiAgICAwMS1NYXktMjAwNSAgICBCSkQgICAgIEFkZGVkIGRlZmluaXRpb25zIGZvciBzM2MyNDQwIGNvbnRyb2xsZXIKICovCiAKICNpZm5kZWYgX19BU01fQVJNX1JFR1NfTkFORApAQCAtMjYsNiArMjcsMjIgQEAKICNkZWZpbmUgUzNDMjQxMF9ORlNUQVQgIFMzQzI0MTBfTkZSRUcoMHgxMCkKICNkZWZpbmUgUzNDMjQxMF9ORkVDQyAgIFMzQzI0MTBfTkZSRUcoMHgxNCkKIAorI2RlZmluZSBTM0MyNDQwX05GQ09OVCAgIFMzQzI0MTBfTkZSRUcoMHgwNCkKKyNkZWZpbmUgUzNDMjQ0MF9ORkNNRCAgICBTM0MyNDEwX05GUkVHKDB4MDgpCisjZGVmaW5lIFMzQzI0NDBfTkZBRERSICAgUzNDMjQxMF9ORlJFRygweDBDKQorI2RlZmluZSBTM0MyNDQwX05GREFUQSAgIFMzQzI0MTBfTkZSRUcoMHgxMCkKKyNkZWZpbmUgUzNDMjQ0MF9ORkVDQ0QwICBTM0MyNDEwX05GUkVHKDB4MTQpCisjZGVmaW5lIFMzQzI0NDBfTkZFQ0NEMSAgUzNDMjQxMF9ORlJFRygweDE4KQorI2RlZmluZSBTM0MyNDQwX05GRUNDRCAgIFMzQzI0MTBfTkZSRUcoMHgxQykKKyNkZWZpbmUgUzNDMjQ0MF9ORlNUQVQgICBTM0MyNDEwX05GUkVHKDB4MjApCisjZGVmaW5lIFMzQzI0NDBfTkZFU1RBVDAgUzNDMjQxMF9ORlJFRygweDI0KQorI2RlZmluZSBTM0MyNDQwX05GRVNUQVQxIFMzQzI0MTBfTkZSRUcoMHgyOCkKKyNkZWZpbmUgUzNDMjQ0MF9ORk1FQ0MwICBTM0MyNDEwX05GUkVHKDB4MkMpCisjZGVmaW5lIFMzQzI0NDBfTkZNRUNDMSAgUzNDMjQxMF9ORlJFRygweDMwKQorI2RlZmluZSBTM0MyNDQwX05GU0VDQyAgIFMzQzI0MTBfTkZSRUcoMHgzNCkKKyNkZWZpbmUgUzNDMjQ0MF9ORlNCTEsgICBTM0MyNDEwX05GUkVHKDB4MzgpCisjZGVmaW5lIFMzQzI0NDBfTkZFQkxLICAgUzNDMjQxMF9ORlJFRygweDNDKQorCiAjZGVmaW5lIFMzQzI0MTBfTkZDT05GX0VOICAgICAgICAgICgxPDwxNSkKICNkZWZpbmUgUzNDMjQxMF9ORkNPTkZfNTEyQllURSAgICAgKDE8PDE0KQogI2RlZmluZSBTM0MyNDEwX05GQ09ORl80U1RFUCAgICAgICAoMTw8MTMpCkBAIC0zNyw3ICs1NCwyOCBAQAogCiAjZGVmaW5lIFMzQzI0MTBfTkZTVEFUX0JVU1kgICAgICAgICgxPDwwKQogCi0vKiB0aGluayBFQ0MgY2FuIG9ubHkgYmUgOGJpdCByZWFkPyAqLworI2RlZmluZSBTM0MyNDQwX05GQ09ORl9CVVNXSURUSF84CSgwPDwwKQorI2RlZmluZSBTM0MyNDQwX05GQ09ORl9CVVNXSURUSF8xNgkoMTw8MCkKKyNkZWZpbmUgUzNDMjQ0MF9ORkNPTkZfQURWRkxBU0gJCSgxPDwzKQorI2RlZmluZSBTM0MyNDQwX05GQ09ORl9UQUNMUyh4KQkJKCh4KTw8MTIpCisjZGVmaW5lIFMzQzI0NDBfTkZDT05GX1RXUlBIMCh4KQkoKHgpPDw4KQorI2RlZmluZSBTM0MyNDQwX05GQ09ORl9UV1JQSDEoeCkJKCh4KTw8NCkKKworI2RlZmluZSBTM0MyNDQwX05GQ09OVF9MT0NLVElHSFQJKDE8PDEzKQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9TT0ZUTE9DSwkJKDE8PDEyKQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9JTExFR0FMQUNDX0VOCSgxPDwxMCkKKyNkZWZpbmUgUzNDMjQ0MF9ORkNPTlRfUk5CSU5UX0VOCSgxPDw5KQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9STl9GQUxMSU5HCSgxPDw4KQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9TUEFSRV9FQ0NMT0NLCSgxPDw2KQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9NQUlOX0VDQ0xPQ0sJKDE8PDUpCisjZGVmaW5lIFMzQzI0NDBfTkZDT05UX0lOSVRFQ0MJCSgxPDw0KQorI2RlZmluZSBTM0MyNDQwX05GQ09OVF9uRkNFCQkoMTw8MSkKKyNkZWZpbmUgUzNDMjQ0MF9ORkNPTlRfRU5BQkxFCQkoMTw8MCkKKworI2RlZmluZSBTM0MyNDQwX05GU1RBVF9SRUFEWQkJKDE8PDApCisjZGVmaW5lIFMzQzI0NDBfTkZTVEFUX25DRQkJKDE8PDEpCisjZGVmaW5lIFMzQzI0NDBfTkZTVEFUX1JuQl9DSEFOR0UJKDE8PDIpCisjZGVmaW5lIFMzQzI0NDBfTkZTVEFUX0lMTEVHQUxfQUNDRVNTCSgxPDwzKQogCiAjZW5kaWYgLyogX19BU01fQVJNX1JFR1NfTkFORCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BhZ2UuaAppbmRleCA0Y2EzYThlLi4wMTljNDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wYWdlLmgKQEAgLTExNCwxOSArMTE0LDggQEAKIAkJCQkgdW5zaWduZWQgbG9uZyB1c2VyKTsKICNlbmRpZgogCi0jZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShhZGRyLHZhZGRyLHBnKQkJCVwKLQlkbyB7CQkJCQkJXAotCQlwcmVlbXB0X2Rpc2FibGUoKTsJCQlcCi0JCV9fY3B1X2NsZWFyX3VzZXJfcGFnZShhZGRyLCB2YWRkcik7CVwKLQkJcHJlZW1wdF9lbmFibGUoKTsJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0byxmcm9tLHZhZGRyLHBnKQkJXAotCWRvIHsJCQkJCQlcCi0JCXByZWVtcHRfZGlzYWJsZSgpOwkJCVwKLQkJX19jcHVfY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyKTsJXAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCVwKLQl9IHdoaWxlICgwKQorI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UoYWRkcix2YWRkcixwZykJIF9fY3B1X2NsZWFyX3VzZXJfcGFnZShhZGRyLCB2YWRkcikKKyNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sZnJvbSx2YWRkcixwZykgX19jcHVfY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyKQogCiAjZGVmaW5lIGNsZWFyX3BhZ2UocGFnZSkJbWVtemVybygodm9pZCAqKShwYWdlKSwgUEFHRV9TSVpFKQogZXh0ZXJuIHZvaWQgY29weV9wYWdlKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tKTsKQEAgLTE3MSw2ICsxNjAsOSBAQAogCiAjZW5kaWYgLyogU1RSSUNUX01NX1RZUEVDSEVDS1MgKi8KIAorLyogdGhlIHVwcGVyLW1vc3QgcGFnZSB0YWJsZSBwb2ludGVyICovCitleHRlcm4gcG1kX3QgKnRvcF9wbWQ7CisKIC8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCiBzdGF0aWMgaW5saW5lIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9pb2N0bDMyLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3RsMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkMjI3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2lvY3RsMzIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL21mLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL21mLmgKaW5kZXggMmU1OWE4ZS4uZGIzMzNlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9tZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2lTZXJpZXMvbWYuaApAQCAtNTIsNiArNTIsNyBAQAogZXh0ZXJuIHZvaWQgbWZfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIGludCBtZl9nZXRfcnRjKHN0cnVjdCBydGNfdGltZSAqdG0pOworZXh0ZXJuIGludCBtZl9nZXRfYm9vdF9ydGMoc3RydWN0IHJ0Y190aW1lICp0bSk7CiBleHRlcm4gaW50IG1mX3NldF9ydGMoc3RydWN0IHJ0Y190aW1lICp0bSk7CiAKICNlbmRpZiAvKiBfQVNNX1BQQzY0X0lTRVJJRVNfTUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vYXJjaC1zaWduYWwtaTM4Ni5oIGIvaW5jbHVkZS9hc20tdW0vYXJjaC1zaWduYWwtaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXVtL2FyY2gtc2lnbmFsLWkzODYuaAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9lbGYtaTM4Ni5oIGIvaW5jbHVkZS9hc20tdW0vZWxmLWkzODYuaAppbmRleCBiNzJlMjM1Li45YmFiNzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9lbGYtaTM4Ni5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2VsZi1pMzg2LmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9fVU1fRUxGX0kzODZfSAogI2RlZmluZSBfX1VNX0VMRl9JMzg2X0gKIAotI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlIDxhc20vdXNlci5oPgogCiAjZGVmaW5lIFJfMzg2X05PTkUJMAogI2RlZmluZSBSXzM4Nl8zMgkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9lbGYteDg2XzY0LmggYi9pbmNsdWRlL2FzbS11bS9lbGYteDg2XzY0LmgKaW5kZXggMTkzMDlkMC4uOGE4MjQ2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vZWxmLXg4Nl82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2VsZi14ODZfNjQuaApAQCAtOCw2ICs4LDI3IEBACiAKICNpbmNsdWRlIDxhc20vdXNlci5oPgogCisvKiB4ODYtNjQgcmVsb2NhdGlvbiB0eXBlcywgdGFrZW4gZnJvbSBhc20teDg2XzY0L2VsZi5oICovCisjZGVmaW5lIFJfWDg2XzY0X05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9YODZfNjRfNjQJCTEJLyogRGlyZWN0IDY0IGJpdCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEMzMgkJMgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2lnbmVkICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVDMyCQkzCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUExUMzIJCTQJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfWDg2XzY0X0NPUFkJCTUJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1g4Nl82NF9HTE9CX0RBVAk2CS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfSlVNUF9TTE9UCTcJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9SRUxBVElWRQk4CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUENSRUwJOQkvKiAzMiBiaXQgc2lnbmVkIHBjIHJlbGF0aXZlCisJCQkJCSAgIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzIJCTEwCS8qIERpcmVjdCAzMiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8zMlMJCTExCS8qIERpcmVjdCAzMiBiaXQgc2lnbiBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8xNgkJMTIJLyogRGlyZWN0IDE2IGJpdCB6ZXJvIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMTYJCTEzCS8qIDE2IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisjZGVmaW5lIFJfWDg2XzY0XzgJCTE0CS8qIERpcmVjdCA4IGJpdCBzaWduIGV4dGVuZGVkICAqLworI2RlZmluZSBSX1g4Nl82NF9QQzgJCTE1CS8qIDggYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KKworI2RlZmluZSBSX1g4Nl82NF9OVU0JCTE2CisKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OwogCiAjZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YoZWxmX2dyZWdfdCkpCkBAIC00NCw3ICs2NSw4IEBACiB9IHdoaWxlICgwKQogCiAjaWZkZWYgVElGX0lBMzIgLyogWFhYICovCi0gICAgICAgIGNsZWFyX3RocmVhZF9mbGFnKFRJRl9JQTMyKTsgXAorI2Vycm9yIFhYWCwgaW5kZWVkCisgICAgICAgIGNsZWFyX3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKICNlbmRpZgogCiAjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9lbGYuaCBiL2luY2x1ZGUvYXNtLXVtL2VsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXVtL2VsZi5oCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpY2RlZi5oCmluZGV4IDNkNzYyN2YuLmJmZWJkYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWNkZWYuaApAQCAtMTEyLDcgKzExMiw3IEBACiAKICNkZWZpbmUgQVBJQ19CQVNFIChmaXhfdG9fdmlydChGSVhfQVBJQ19CQVNFKSkKIAotI2RlZmluZSBNQVhfSU9fQVBJQ1MgMzIKKyNkZWZpbmUgTUFYX0lPX0FQSUNTIDEyOAogCiAvKgogICogQWxsIHg4Ni02NCBzeXN0ZW1zIGFyZSB4QVBJQyBjb21wYXRpYmxlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2J1Zy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2J1Zy5oCmluZGV4IGJkYmY2NmUuLjNkMmE2NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9idWcuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYnVnLmgKQEAgLTIxLDYgKzIxLDggQEAKIAlhc20gdm9sYXRpbGUoInVkMiA7IC5xdWFkICVjMSA7IC5zaG9ydCAlYzAiIDo6IFwKIAkJICAgICAiaSIoX19MSU5FX18pLCAiaSIgKF9fc3RyaW5naWZ5KF9fRklMRV9fKSkpCiB2b2lkIG91dF9vZl9saW5lX2J1Zyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0X29mX2xpbmVfYnVnKHZvaWQpIHsgfQogI2VuZGlmCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCmluZGV4IDdlZmM5MzIuLjMyNTczNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaApAQCAtMjAyLDcgKzIwMiw2IEBACiAjZGVmaW5lIGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzIChtcF9pcnFfZW50cmllcyAmJiAhc2tpcF9pb2FwaWNfc2V0dXAgJiYgaW9fYXBpY19pcnFzKQogCiAjaWZkZWYgQ09ORklHX0FDUElfQk9PVAotZXh0ZXJuIGludCBpb19hcGljX2dldF91bmlxdWVfaWQgKGludCBpb2FwaWMsIGludCBhcGljX2lkKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfdmVyc2lvbiAoaW50IGlvYXBpYyk7CiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMgKGludCBpb2FwaWMpOwogZXh0ZXJuIGludCBpb19hcGljX3NldF9wY2lfcm91dGluZyAoaW50IGlvYXBpYywgaW50IHBpbiwgaW50IGlycSwgaW50LCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lvY3RsMzIuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb2N0bDMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDIyN2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvY3RsMzIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmgKaW5kZXggMjFkNTZiMC4uZDNhYmZjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L25taS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ubWkuaApAQCAtNTMsNSArNTMsNyBAQAogCiBleHRlcm4gaW50IHBhbmljX29uX3RpbWVvdXQ7CiBleHRlcm4gaW50IHVua25vd25fbm1pX3BhbmljOworCitleHRlcm4gaW50IGNoZWNrX25taV93YXRjaGRvZyh2b2lkKTsKICAKICNlbmRpZiAvKiBBU01fTk1JX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAppbmRleCBmMDU4MWMzLi5kNjQxYjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCkBAIC02Miw3ICs2Miw2IEBACiAJaW50CXg4Nl90bGJzaXplOwkvKiBudW1iZXIgb2YgNEsgcGFnZXMgaW4gRFRMQi9JVExCIGNvbWJpbmVkKGluIHBhZ2VzKSovCiAgICAgICAgIF9fdTggICAgeDg2X3ZpcnRfYml0cywgeDg2X3BoeXNfYml0czsKIAlfX3U4CXg4Nl9udW1fY29yZXM7Ci0JX191OAl4ODZfYXBpY2lkOwogICAgICAgICBfX3UzMiAgIHg4Nl9wb3dlcjsgCQogCV9fdTMyICAgZXh0ZW5kZWRfY3B1aWRfbGV2ZWw7CS8qIE1heCBleHRlbmRlZCBDUFVJRCBmdW5jdGlvbiBzdXBwb3J0ZWQgKi8KIAl1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKQEAgLTE1OSw5ICsxNTgsOSBAQAogCiAKIC8qCi0gKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZS4gNDdiaXRzLgorICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemUuIDQ3Yml0cyBtaW51cyBvbmUgZ3VhcmQgcGFnZS4KICAqLwotI2RlZmluZSBUQVNLX1NJWkUJKDB4ODAwMDAwMDAwMDAwVUwpCisjZGVmaW5lIFRBU0tfU0laRQkoMHg4MDAwMDAwMDAwMDBVTCAtIDQwOTYpCiAKIC8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IGQwZjhmOGIuLmYyZjA3MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCkBAIC0zMCw2ICszMCwxMSBAQAogZXh0ZXJuIHZvaWQgaW9tbXVfaG9sZV9pbml0KHZvaWQpOwogCiBleHRlcm4gdm9pZCB0aW1lX2luaXRfZ3RvZCh2b2lkKTsKK2V4dGVybiBpbnQgcG10aW1lcl9tYXJrX29mZnNldCh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZG9fZ2V0dGltZW9mZnNldF9wbSh2b2lkKTsKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKK2V4dGVybiBpbnQgc3lzY3RsX3ZzeXNjYWxsOwogCiBleHRlcm4gdm9pZCBkb19zb2Z0aXJxX3RodW5rKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCmluZGV4IGIwYzhkNDMuLjI4NzJkYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCkBAIC0yNSw2ICsyNSw3IEBACiAKICNkZWZpbmUgVlhUSU1FX1RTQwkxCiAjZGVmaW5lIFZYVElNRV9IUEVUCTIKKyNkZWZpbmUgVlhUSU1FX1BNVE1SCTMKIAogc3RydWN0IHZ4dGltZV9kYXRhIHsKIAlsb25nIGhwZXRfYWRkcmVzczsJLyogSFBFVCBiYXNlIGFkZHJlc3MgKi8KQEAgLTU0LDYgKzU1LDggQEAKIGV4dGVybiBpbnQgc3lzY3RsX3ZzeXNjYWxsOwogZXh0ZXJuIHNlcWxvY2tfdCB4dGltZV9sb2NrOwogCitleHRlcm4gaW50IHN5c2N0bF92c3lzY2FsbDsKKwogI2RlZmluZSBBUkNIX0hBVkVfWFRJTUVfTE9DSyAxCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCBjZjQ3MDQ1Li5kZjk0YzBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTI3Myw5ICsyNzMsNiBAQAogCQkJCQkgICBCSU9TIGRhdGEgcmVsZXZhbnQgdG8gZGV2aWNlKSAqLwogCXN0cnVjdCBkZXZfcG1faW5mbwlwb3dlcjsKIAotCXUzMgkJZGV0YWNoX3N0YXRlOwkvKiBTdGF0ZSB0byBlbnRlciB3aGVuIGRldmljZSBpcwotCQkJCQkgICBkZXRhY2hlZCBmcm9tIGl0cyBkcml2ZXIuICovCi0KIAl1NjQJCSpkbWFfbWFzazsJLyogZG1hIG1hc2sgKGlmIGRtYSdhYmxlIGRldmljZSkgKi8KIAl1NjQJCWNvaGVyZW50X2RtYV9tYXNrOy8qIExpa2UgZG1hX21hc2ssIGJ1dCBmb3IKIAkJCQkJICAgICBhbGxvY19jb2hlcmVudCBtYXBwaW5ncyBhcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lcnIuaCBiL2luY2x1ZGUvbGludXgvZXJyLmgKaW5kZXggMTdjNTVkZi4uZmY3MWQyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lcnIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Vyci5oCkBAIC0xMyw2ICsxMyw4IEBACiAgKiBUaGlzIHNob3VsZCBiZSBhIHBlci1hcmNoaXRlY3R1cmUgdGhpbmcsIHRvIGFsbG93IGRpZmZlcmVudAogICogZXJyb3IgYW5kIHBvaW50ZXIgZGVjaXNpb25zLgogICovCisjZGVmaW5lIElTX0VSUl9WQUxVRSh4KSB1bmxpa2VseSgoeCkgPiAodW5zaWduZWQgbG9uZyktMTAwMEwpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqRVJSX1BUUihsb25nIGVycm9yKQogewogCXJldHVybiAodm9pZCAqKSBlcnJvcjsKQEAgLTI1LDcgKzI3LDcgQEAKIAogc3RhdGljIGlubGluZSBsb25nIElTX0VSUihjb25zdCB2b2lkICpwdHIpCiB7Ci0JcmV0dXJuIHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKXB0ciA+ICh1bnNpZ25lZCBsb25nKS0xMDAwTCk7CisJcmV0dXJuIElTX0VSUl9WQUxVRSgodW5zaWduZWQgbG9uZylwdHIpOwogfQogCiAjZW5kaWYgLyogX0xJTlVYX0VSUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3RyLmggYi9pbmNsdWRlL2xpbnV4L2lmX3RyLmgKaW5kZXggNGZkNDUxZi4uYTJiMDFlMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3RyLmgKQEAgLTksNyArOSw3IEBACiAgKgogICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KICAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KLSAqICAgIFBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgkJUGV0ZXIgRGUgU2NocmlqdmVyLCA8c3R1ZDExQGNjNC5rdWxldXZlbi5hYy5iZT4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xOSwyNCArMTksMTYgQEAKICNpZm5kZWYgX0xJTlVYX0lGX1RSX0gKICNkZWZpbmUgX0xJTlVYX0lGX1RSX0gKIAotCiAvKiBJRUVFIDgwMi41IFRva2VuLVJpbmcgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCiAgICBhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAqLwotI2RlZmluZSBUUl9BTEVOCTYJCS8qIE9jdGV0cyBpbiBvbmUgZXRoZXJuZXQgYWRkcgkgKi8KLSNkZWZpbmUgVFJfSExFTiAgIChzaXplb2Yoc3RydWN0IHRyaF9oZHIpK3NpemVvZihzdHJ1Y3QgdHJsbGMpKQotI2RlZmluZSBBQwkJCTB4MTAKLSNkZWZpbmUgTExDX0ZSQU1FIDB4NDAKLSNpZiAwCi0jZGVmaW5lIEVUSF9ITEVOCTE0CQkvKiBUb3RhbCBvY3RldHMgaW4gaGVhZGVyLgkgKi8KLSNkZWZpbmUgRVRIX1pMRU4JNjAJCS8qIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCi0jZGVmaW5lIEVUSF9EQVRBX0xFTgkxNTAwCQkvKiBNYXguIG9jdGV0cyBpbiBwYXlsb2FkCSAqLwotI2RlZmluZSBFVEhfRlJBTUVfTEVOCTE1MTQJCS8qIE1heC4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCi0jZW5kaWYKLQorI2RlZmluZSBUUl9BTEVOCQk2CQkvKiBPY3RldHMgaW4gb25lIHRva2VuLXJpbmcgYWRkciAqLworI2RlZmluZSBUUl9ITEVOIAkoc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKStzaXplb2Yoc3RydWN0IHRybGxjKSkKKyNkZWZpbmUgQUMJCTB4MTAKKyNkZWZpbmUgTExDX0ZSQU1FIAkweDQwCiAKIC8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KLSNkZWZpbmUgRVhURU5ERURfU0FQIDB4QUEKLSNkZWZpbmUgVUlfQ01EICAgICAgIDB4MDMKKyNkZWZpbmUgRVhURU5ERURfU0FQIAkweEFBCisjZGVmaW5lIFVJX0NNRCAgICAgICAJMHgwMwogCiAvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgZnJhbWUgaGVhZGVyLiAqLwogc3RydWN0IHRyaF9oZHIgewpAQCAtOTYsMTQgKzg4LDEzIEBACiB9OwogCiAvKiBzb3VyY2Ugcm91dGluZyBzdHVmZiAqLwotCi0jZGVmaW5lIFRSX1JJSSAweDgwCi0jZGVmaW5lIFRSX1JDRl9ESVJfQklUIDB4ODAKLSNkZWZpbmUgVFJfUkNGX0xFTl9NQVNLIDB4MWYwMAotI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUIDB4ODAwMCAgICAgICAgIC8qIGFsbC1yb3V0ZXMgYnJvYWRjYXN0ICovCi0jZGVmaW5lIFRSX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEMwMDAgLyogc2luZ2xlLXJvdXRlIGJyb2FkY2FzdCAqLwotI2RlZmluZSBUUl9SQ0ZfRlJBTUUySyAweDIwCi0jZGVmaW5lIFRSX1JDRl9CUk9BRENBU1RfTUFTSyAweEMwMDAKLSNkZWZpbmUgVFJfTUFYUklGTEVOIDE4CisjZGVmaW5lIFRSX1JJSSAJCQkweDgwCisjZGVmaW5lIFRSX1JDRl9ESVJfQklUIAkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfTEVOX01BU0sgCTB4MWYwMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUIAkweDgwMDAJLyogYWxsLXJvdXRlcyBicm9hZGNhc3QgKi8KKyNkZWZpbmUgVFJfUkNGX0xJTUlURURfQlJPQURDQVNUIDB4QzAwMAkvKiBzaW5nbGUtcm91dGUgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9GUkFNRTJLIAkJMHgyMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUX01BU0sgCTB4QzAwMAorI2RlZmluZSBUUl9NQVhSSUZMRU4gCQkxOAogCiAjZW5kaWYJLyogX0xJTlVYX0lGX1RSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IDUwNTE2MGEuLjFmN2UyMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtNTg0LDYgKzU4NCwxMyBAQAogCWFwLT5vcHMtPnNjcl93cml0ZShhcCwgcmVnLCB2YWwpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2NyX3dyaXRlX2ZsdXNoKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCByZWcsIAorCQkJCSAgIHUzMiB2YWwpCit7CisJYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCByZWcsIHZhbCk7CisJKHZvaWQpIGFwLT5vcHMtPnNjcl9yZWFkKGFwLCByZWcpOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzYXRhX2Rldl9wcmVzZW50KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJcmV0dXJuICgoc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpICYgMHhmKSA9PSAweDMpID8gMSA6IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oIGIvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaAppbmRleCA3YjkwNGM1Li44OTYzNDI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmgKQEAgLTE5NSw2ICsxOTUsMzMgQEAKICNkZWZpbmUgTU1DX1ZERF8zNV8zNgkweDAwODAwMDAwCS8qIFZERCB2b2x0YWdlIDMuNSB+IDMuNiAqLwogI2RlZmluZSBNTUNfQ0FSRF9CVVNZCTB4ODAwMDAwMDAJLyogQ2FyZCBQb3dlciB1cCBzdGF0dXMgYml0ICovCiAKKy8qCisgKiBDYXJkIENvbW1hbmQgQ2xhc3NlcyAoQ0NDKQorICovCisjZGVmaW5lIENDQ19CQVNJQwkJKDE8PDApCS8qICgwKSBCYXNpYyBwcm90b2NvbCBmdW5jdGlvbnMgKi8KKwkJCQkJLyogKENNRDAsMSwyLDMsNCw3LDksMTAsMTIsMTMsMTUpICovCisjZGVmaW5lIENDQ19TVFJFQU1fUkVBRAkJKDE8PDEpCS8qICgxKSBTdHJlYW0gcmVhZCBjb21tYW5kcyAqLworCQkJCQkvKiAoQ01EMTEpICovCisjZGVmaW5lIENDQ19CTE9DS19SRUFECQkoMTw8MikJLyogKDIpIEJsb2NrIHJlYWQgY29tbWFuZHMgKi8KKwkJCQkJLyogKENNRDE2LDE3LDE4KSAqLworI2RlZmluZSBDQ0NfU1RSRUFNX1dSSVRFCSgxPDwzKQkvKiAoMykgU3RyZWFtIHdyaXRlIGNvbW1hbmRzICovCisJCQkJCS8qIChDTUQyMCkgKi8KKyNkZWZpbmUgQ0NDX0JMT0NLX1dSSVRFCQkoMTw8NCkJLyogKDQpIEJsb2NrIHdyaXRlIGNvbW1hbmRzICovCisJCQkJCS8qIChDTUQxNiwyNCwyNSwyNiwyNykgKi8KKyNkZWZpbmUgQ0NDX0VSQVNFCQkoMTw8NSkJLyogKDUpIEFiaWxpdHkgdG8gZXJhc2UgYmxvY2tzICovCisJCQkJCS8qIChDTUQzMiwzMywzNCwzNSwzNiwzNywzOCwzOSkgKi8KKyNkZWZpbmUgQ0NDX1dSSVRFX1BST1QJCSgxPDw2KQkvKiAoNikgQWJsZSB0byB3cml0ZSBwcm90ZWN0IGJsb2NrcyAqLworCQkJCQkvKiAoQ01EMjgsMjksMzApICovCisjZGVmaW5lIENDQ19MT0NLX0NBUkQJCSgxPDw3KQkvKiAoNykgQWJsZSB0byBsb2NrIGRvd24gY2FyZCAqLworCQkJCQkvKiAoQ01EMTYsQ01ENDIpICovCisjZGVmaW5lIENDQ19BUFBfU1BFQwkJKDE8PDgpCS8qICg4KSBBcHBsaWNhdGlvbiBzcGVjaWZpYyAqLworCQkJCQkvKiAoQ01ENTUsNTYsNTcsQUNNRCopICovCisjZGVmaW5lIENDQ19JT19NT0RFCQkoMTw8OSkJLyogKDkpIEkvTyBtb2RlICovCisJCQkJCS8qIChDTUQ1LDM5LDQwLDUyLDUzKSAqLworI2RlZmluZSBDQ0NfU1dJVENICQkoMTw8MTApCS8qICgxMCkgSGlnaCBzcGVlZCBzd2l0Y2ggKi8KKwkJCQkJLyogKENNRDYsMzQsMzUsMzYsMzcsNTApICovCisJCQkJCS8qICgxMSkgUmVzZXJ2ZWQgKi8KKwkJCQkJLyogKENNRD8pICovCiAKIC8qCiAgKiBDU0QgZmllbGQgZGVmaW5pdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IDZkOTk3ZmYuLjIwY2IyMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMTAxLDcgKzEwMSw2IEBACiAgKiAgQHNrOiBpbnRlcm5hbCBuZXR3b3JraW5nIHByb3RvY29sIGFnbm9zdGljIHNvY2tldCByZXByZXNlbnRhdGlvbgogICogIEB3YWl0OiB3YWl0IHF1ZXVlIGZvciBzZXZlcmFsIHVzZXMKICAqICBAdHlwZTogc29ja2V0IHR5cGUgKCVTT0NLX1NUUkVBTSwgZXRjKQotICogIEBwYXNzY3JlZDogY3JlZGVudGlhbHMgKHVzZWQgb25seSBpbiBVbml4IFNvY2tldHMgKGFrYSBQRl9MT0NBTCkpCiAgKi8KIHN0cnVjdCBzb2NrZXQgewogCXNvY2tldF9zdGF0ZQkJc3RhdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCBhYzExZDczLi5iMjViZDAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTUwMyw3ICs1MDMsNyBAQAogI2RlZmluZSBTRVRfTkVUREVWX0RFVihuZXQsIHBkZXYpCSgobmV0KS0+Y2xhc3NfZGV2LmRldiA9IChwZGV2KSkKIAogc3RydWN0IHBhY2tldF90eXBlIHsKLQl1bnNpZ25lZCBzaG9ydAkJdHlwZTsJLyogVGhpcyBpcyByZWFsbHkgaHRvbnMoZXRoZXJfdHlwZSkuCSovCisJX19iZTE2CQkJdHlwZTsJLyogVGhpcyBpcyByZWFsbHkgaHRvbnMoZXRoZXJfdHlwZSkuCSovCiAJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CS8qIE5VTEwgaXMgd2lsZGNhcmRlZCBoZXJlCQkqLwogCWludAkJCSgqZnVuYykgKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosCiAJCQkJCSBzdHJ1Y3QgcGFja2V0X3R5cGUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGFlMjc3OTIuLjdiOTcyMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0yMDY0LDYgKzIwNjQsNyBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPQURDT00JCTB4MTRlNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUyCTB4MTYwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUyTQkweDE2MDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMAkweDE2NDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMQkweDE2NDUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMgkweDE2NDYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCBjM2ZiNTk4Li5kNjAyNWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC00NzksNiArNDc5LDI1IEBACiAJfQogfQogCisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKworc3RhdGljIGlubGluZSB2b2lkCit1YXJ0X2luc2VydF9jaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzdGF0dXMsCisJCSB1bnNpZ25lZCBpbnQgb3ZlcnJ1biwgdW5zaWduZWQgaW50IGNoLCB1bnNpZ25lZCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OworCisJaWYgKChzdGF0dXMgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiB+b3ZlcnJ1bikgPT0gMCkKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisKKwkvKgorCSAqIE92ZXJydW4gaXMgc3BlY2lhbC4gIFNpbmNlIGl0J3MgcmVwb3J0ZWQgaW1tZWRpYXRlbHksCisJICogaXQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCSAqLworCWlmIChzdGF0dXMgJiB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICYgb3ZlcnJ1bikKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7Cit9CisKIC8qCiAgKglVQVJUX0VOQUJMRV9NUyAtIGRldGVybWluZSBpZiBwb3J0IHNob3VsZCBlbmFibGUgbW9kZW0gc3RhdHVzIGlycXMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCmluZGV4IGU4OTVmM2UuLmQ2YmEwNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKQEAgLTI0OCw3ICsyNDgsNyBAQAogCiAjZGVmaW5lIF9zcGluX3RyeWxvY2tfYmgobG9jaykJKHtwcmVlbXB0X2Rpc2FibGUoKTsgbG9jYWxfYmhfZGlzYWJsZSgpOyBcCiAJCQkJX3Jhd19zcGluX3RyeWxvY2sobG9jaykgPyBcCi0JCQkJMSA6ICh7cHJlZW1wdF9lbmFibGUoKTsgbG9jYWxfYmhfZW5hYmxlKCk7IDA7fSk7fSkKKwkJCQkxIDogKHtwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7IGxvY2FsX2JoX2VuYWJsZSgpOyAwO30pO30pCiAKICNkZWZpbmUgX3NwaW5fbG9jayhsb2NrKQlcCiBkbyB7IFwKQEAgLTM4Myw3ICszODMsNyBAQAogI2RlZmluZSBfc3Bpbl91bmxvY2tfYmgobG9jaykgXAogZG8geyBcCiAJX3Jhd19zcGluX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7IFwKIAlsb2NhbF9iaF9lbmFibGUoKTsgXAogCV9fcmVsZWFzZShsb2NrKTsgXAogfSB3aGlsZSAoMCkKQEAgLTM5MSw3ICszOTEsNyBAQAogI2RlZmluZSBfd3JpdGVfdW5sb2NrX2JoKGxvY2spIFwKIGRvIHsgXAogCV9yYXdfd3JpdGVfdW5sb2NrKGxvY2spOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAorCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsgXAogCWxvY2FsX2JoX2VuYWJsZSgpOyBcCiAJX19yZWxlYXNlKGxvY2spOyBcCiB9IHdoaWxlICgwKQpAQCAtNDIzLDggKzQyMyw4IEBACiAjZGVmaW5lIF9yZWFkX3VubG9ja19iaChsb2NrKQlcCiBkbyB7IFwKIAlfcmF3X3JlYWRfdW5sb2NrKGxvY2spOwlcCisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwlcCiAJbG9jYWxfYmhfZW5hYmxlKCk7CVwKLQlwcmVlbXB0X2VuYWJsZSgpOwlcCiAJX19yZWxlYXNlKGxvY2spOyBcCiB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDNhMzU4YzguLjY0MDlkOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC00MSw2ICs0MSw3IEBACiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGV4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICpyZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKTsKK2V4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICpfX3JlbW92ZV92bV9hcmVhKHZvaWQgKmFkZHIpOwogZXh0ZXJuIGludCBtYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhLCBwZ3Byb3RfdCBwcm90LAogCQkJc3RydWN0IHBhZ2UgKioqcGFnZXMpOwogZXh0ZXJuIHZvaWQgdW5tYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2FpdC5oIGIvaW5jbHVkZS9saW51eC93YWl0LmgKaW5kZXggMTdjODc0YS4uYzk0ODZjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93YWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC93YWl0LmgKQEAgLTM4Niw5ICszODYsNyBAQAogCXdhaXRfcXVldWVfdCBuYW1lID0gewkJCQkJCVwKIAkJLnRhc2sJCT0gY3VycmVudCwJCQkJXAogCQkuZnVuYwkJPSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb24sCQlcCi0JCS50YXNrX2xpc3QJPSB7CS5uZXh0ID0gJihuYW1lKS50YXNrX2xpc3QsCVwKLQkJCQkJLnByZXYgPSAmKG5hbWUpLnRhc2tfbGlzdCwJXAotCQkJCX0sCQkJCQlcCisJCS50YXNrX2xpc3QJPSBMSVNUX0hFQURfSU5JVCgobmFtZSkudGFza19saXN0KSwJXAogCX0KIAogI2RlZmluZSBERUZJTkVfV0FJVF9CSVQobmFtZSwgd29yZCwgYml0KQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi1kdmIuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLWR2Yi5oCmluZGV4IDk0YmQzMzYuLmFkMGEwN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLWR2Yi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLWR2Yi5oCkBAIC0xNiw3ICsxNiw3IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbmZlZWRzOwogCiAJLyogdmlkZW9idWZfZHZiXyh1bilyZWdpc3RlciBtYW5nZXMgdGhpcyAqLwotCXN0cnVjdCBkdmJfYWRhcHRlciAgICAgICAgICphZGFwdGVyOworCXN0cnVjdCBkdmJfYWRhcHRlciAgICAgICAgIGFkYXB0ZXI7CiAJc3RydWN0IGR2Yl9kZW11eCAgICAgICAgICAgZGVtdXg7CiAJc3RydWN0IGRteGRldiAgICAgICAgICAgICAgZG14ZGV2OwogCXN0cnVjdCBkbXhfZnJvbnRlbmQgICAgICAgIGZlX2h3OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWN0X2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L2FjdF9nZW5lcmljLmgKaW5kZXggOTViMTIwNy4uYzlkYWE3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYWN0X2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9hY3RfZ2VuZXJpYy5oCkBAIC0yLDggKzIsOCBAQAogICogaW5jbHVkZS9uZXQvYWN0X2dlbmVyaWMuaAogICoKICovCi0jaWZuZGVmIEFDVF9HRU5FUklDX0gKLSNkZWZpbmUgQUNUX0dFTkVSSUNfSAorI2lmbmRlZiBfTkVUX0FDVF9HRU5FUklDX0gKKyNkZWZpbmUgX05FVF9BQ1RfR0VORVJJQ19ICiBzdGF0aWMgaW5saW5lIGludCB0Y2ZfZGVmYWN0X3JlbGVhc2Uoc3RydWN0IHRjZl9kZWZhY3QgKnAsIGludCBiaW5kKQogewogCWludCByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oCmluZGV4IDZkY2Y0OTcuLmEzMGQ2Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmgKQEAgLTI3LDggKzI3LDExIEBACiAKIHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzIHsKIAlpbnQgcGVyaW9kOwkJLyogdmFsdWUgaW4gdGhlIFBQUi9TRFRSIGNvbW1hbmQgKi8KKwlpbnQgbWluX3BlcmlvZDsKIAlpbnQgb2Zmc2V0OworCWludCBtYXhfb2Zmc2V0OwogCXVuc2lnbmVkIGludCB3aWR0aDoxOwkvKiAwIC0gbmFycm93LCAxIC0gd2lkZSAqLworCXVuc2lnbmVkIGludCBtYXhfd2lkdGg6MTsKIAl1bnNpZ25lZCBpbnQgaXU6MTsJLyogSW5mb3JtYXRpb24gVW5pdHMgZW5hYmxlZCAqLwogCXVuc2lnbmVkIGludCBkdDoxOwkvKiBEVCBjbG9ja2luZyBlbmFibGVkICovCiAJdW5zaWduZWQgaW50IHFhczoxOwkvKiBRdWljayBBcmJpdHJhdGlvbiBhbmQgU2VsZWN0aW9uIGVuYWJsZWQgKi8KQEAgLTYzLDggKzY2LDExIEBACiAKIC8qIGFjY2Vzc29yIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBzcGlfcGVyaW9kKHgpCSgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+cGVyaW9kKQorI2RlZmluZSBzcGlfbWluX3BlcmlvZCh4KSAoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPm1pbl9wZXJpb2QpCiAjZGVmaW5lIHNwaV9vZmZzZXQoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5vZmZzZXQpCisjZGVmaW5lIHNwaV9tYXhfb2Zmc2V0KHgpICgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+bWF4X29mZnNldCkKICNkZWZpbmUgc3BpX3dpZHRoKHgpCSgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+d2lkdGgpCisjZGVmaW5lIHNwaV9tYXhfd2lkdGgoeCkgKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5tYXhfd2lkdGgpCiAjZGVmaW5lIHNwaV9pdSh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPml1KQogI2RlZmluZSBzcGlfZHQoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5kdCkKICNkZWZpbmUgc3BpX3Fhcyh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPnFhcykKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IDJmYjBlNDYuLjA2YjVhNjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtMzAsNiArMzAsNyBAQAogICovCiBpcnFfZGVzY190IGlycV9kZXNjW05SX0lSUVNdIF9fY2FjaGVsaW5lX2FsaWduZWQgPSB7CiAJWzAgLi4uIE5SX0lSUVMtMV0gPSB7CisJCS5zdGF0dXMgPSBJUlFfRElTQUJMRUQsCiAJCS5oYW5kbGVyID0gJm5vX2lycV90eXBlLAogCQkubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRAogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDc5NjBkZGYuLjRjZGViYzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMTU2LDE0ICsxNTYsMTQgQEAKIAkJZ290byBVbmxvY2s7CiAJfQogCi0JcHJfZGVidWcoIlBNOiBQcmVwYXJpbmcgc3lzdGVtIGZvciBzdXNwZW5kXG4iKTsKKwlwcl9kZWJ1ZygiUE06IFByZXBhcmluZyBzeXN0ZW0gZm9yICVzIHNsZWVwXG4iLCBwbV9zdGF0ZXNbc3RhdGVdKTsKIAlpZiAoKGVycm9yID0gc3VzcGVuZF9wcmVwYXJlKHN0YXRlKSkpCiAJCWdvdG8gVW5sb2NrOwogCi0JcHJfZGVidWcoIlBNOiBFbnRlcmluZyBzdGF0ZS5cbiIpOworCXByX2RlYnVnKCJQTTogRW50ZXJpbmcgJXMgc2xlZXBcbiIsIHBtX3N0YXRlc1tzdGF0ZV0pOwogCWVycm9yID0gc3VzcGVuZF9lbnRlcihzdGF0ZSk7CiAKLQlwcl9kZWJ1ZygiUE06IEZpbmlzaGluZyB1cC5cbiIpOworCXByX2RlYnVnKCJQTTogRmluaXNoaW5nIHdha2V1cC5cbiIpOwogCXN1c3BlbmRfZmluaXNoKHN0YXRlKTsKICBVbmxvY2s6CiAJdXAoJnBtX3NlbSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggMjkwYTA3Yy4uMDFiNThkNyAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMTYwLDQyICsxNjAsNiBAQAogCiBfX3NldHVwKCJjb25zb2xlPSIsIGNvbnNvbGVfc2V0dXApOwogCi0vKioKLSAqIGFkZF9wcmVmZXJyZWRfY29uc29sZSAtIGFkZCBhIGRldmljZSB0byB0aGUgbGlzdCBvZiBwcmVmZXJyZWQgY29uc29sZXMuCi0gKgotICogVGhlIGxhc3QgcHJlZmVycmVkIGNvbnNvbGUgYWRkZWQgd2lsbCBiZSB1c2VkIGZvciBrZXJuZWwgbWVzc2FnZXMKLSAqIGFuZCBzdGRpbi9vdXQvZXJyIGZvciBpbml0LiAgTm9ybWFsbHkgdGhpcyBpcyB1c2VkIGJ5IGNvbnNvbGVfc2V0dXAKLSAqIGFib3ZlIHRvIGhhbmRsZSB1c2VyLXN1cHBsaWVkIGNvbnNvbGUgYXJndW1lbnRzOyBob3dldmVyIGl0IGNhbiBhbHNvCi0gKiBiZSB1c2VkIGJ5IGFyY2gtc3BlY2lmaWMgY29kZSBlaXRoZXIgdG8gb3ZlcnJpZGUgdGhlIHVzZXIgb3IgbW9yZQotICogY29tbW9ubHkgdG8gcHJvdmlkZSBhIGRlZmF1bHQgY29uc29sZSAoaWUgZnJvbSBQUk9NIHZhcmlhYmxlcykgd2hlbgotICogdGhlIHVzZXIgaGFzIG5vdCBzdXBwbGllZCBvbmUuCi0gKi8KLWludCBfX2luaXQgYWRkX3ByZWZlcnJlZF9jb25zb2xlKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm9wdGlvbnMpCi17Ci0Jc3RydWN0IGNvbnNvbGVfY21kbGluZSAqYzsKLQlpbnQgaTsKLQotCS8qCi0JICoJU2VlIGlmIHRoaXMgdHR5IGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZCwgYW5kCi0JICoJaWYgd2UgaGF2ZSBhIHNsb3QgZnJlZS4KLQkgKi8KLQlmb3IoaSA9IDA7IGkgPCBNQVhfQ01ETElORUNPTlNPTEVTICYmIGNvbnNvbGVfY21kbGluZVtpXS5uYW1lWzBdOyBpKyspCi0JCWlmIChzdHJjbXAoY29uc29sZV9jbWRsaW5lW2ldLm5hbWUsIG5hbWUpID09IDAgJiYKLQkJCSAgY29uc29sZV9jbWRsaW5lW2ldLmluZGV4ID09IGlkeCkgewotCQkJCXNlbGVjdGVkX2NvbnNvbGUgPSBpOwotCQkJCXJldHVybiAwOwotCQl9Ci0JaWYgKGkgPT0gTUFYX0NNRExJTkVDT05TT0xFUykKLQkJcmV0dXJuIC1FMkJJRzsKLQlzZWxlY3RlZF9jb25zb2xlID0gaTsKLQljID0gJmNvbnNvbGVfY21kbGluZVtpXTsKLQltZW1jcHkoYy0+bmFtZSwgbmFtZSwgc2l6ZW9mKGMtPm5hbWUpKTsKLQljLT5uYW1lW3NpemVvZihjLT5uYW1lKSAtIDFdID0gMDsKLQljLT5vcHRpb25zID0gb3B0aW9uczsKLQljLT5pbmRleCA9IGlkeDsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2luaXQgbG9nX2J1Zl9sZW5fc2V0dXAoY2hhciAqc3RyKQogewogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IG1lbXBhcnNlKHN0ciwgJnN0cik7CkBAIC02NzEsNiArNjM1LDQyIEBACiAjZW5kaWYKIAogLyoqCisgKiBhZGRfcHJlZmVycmVkX2NvbnNvbGUgLSBhZGQgYSBkZXZpY2UgdG8gdGhlIGxpc3Qgb2YgcHJlZmVycmVkIGNvbnNvbGVzLgorICoKKyAqIFRoZSBsYXN0IHByZWZlcnJlZCBjb25zb2xlIGFkZGVkIHdpbGwgYmUgdXNlZCBmb3Iga2VybmVsIG1lc3NhZ2VzCisgKiBhbmQgc3RkaW4vb3V0L2VyciBmb3IgaW5pdC4gIE5vcm1hbGx5IHRoaXMgaXMgdXNlZCBieSBjb25zb2xlX3NldHVwCisgKiBhYm92ZSB0byBoYW5kbGUgdXNlci1zdXBwbGllZCBjb25zb2xlIGFyZ3VtZW50czsgaG93ZXZlciBpdCBjYW4gYWxzbworICogYmUgdXNlZCBieSBhcmNoLXNwZWNpZmljIGNvZGUgZWl0aGVyIHRvIG92ZXJyaWRlIHRoZSB1c2VyIG9yIG1vcmUKKyAqIGNvbW1vbmx5IHRvIHByb3ZpZGUgYSBkZWZhdWx0IGNvbnNvbGUgKGllIGZyb20gUFJPTSB2YXJpYWJsZXMpIHdoZW4KKyAqIHRoZSB1c2VyIGhhcyBub3Qgc3VwcGxpZWQgb25lLgorICovCitpbnQgX19pbml0IGFkZF9wcmVmZXJyZWRfY29uc29sZShjaGFyICpuYW1lLCBpbnQgaWR4LCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCBjb25zb2xlX2NtZGxpbmUgKmM7CisJaW50IGk7CisKKwkvKgorCSAqCVNlZSBpZiB0aGlzIHR0eSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGFuZAorCSAqCWlmIHdlIGhhdmUgYSBzbG90IGZyZWUuCisJICovCisJZm9yKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQorCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuYW1lKSA9PSAwICYmCisJCQkgIGNvbnNvbGVfY21kbGluZVtpXS5pbmRleCA9PSBpZHgpIHsKKwkJCQlzZWxlY3RlZF9jb25zb2xlID0gaTsKKwkJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChpID09IE1BWF9DTURMSU5FQ09OU09MRVMpCisJCXJldHVybiAtRTJCSUc7CisJc2VsZWN0ZWRfY29uc29sZSA9IGk7CisJYyA9ICZjb25zb2xlX2NtZGxpbmVbaV07CisJbWVtY3B5KGMtPm5hbWUsIG5hbWUsIHNpemVvZihjLT5uYW1lKSk7CisJYy0+bmFtZVtzaXplb2YoYy0+bmFtZSkgLSAxXSA9IDA7CisJYy0+b3B0aW9ucyA9IG9wdGlvbnM7CisJYy0+aW5kZXggPSBpZHg7CisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogYWNxdWlyZV9jb25zb2xlX3NlbSAtIGxvY2sgdGhlIGNvbnNvbGUgc3lzdGVtIGZvciBleGNsdXNpdmUgdXNlLgogICoKICAqIEFjcXVpcmVzIGEgc2VtYXBob3JlIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2FsbGVyIGhhcwpkaWZmIC0tZ2l0IGEva2VybmVsL3Byb2ZpbGUuYyBiL2tlcm5lbC9wcm9maWxlLmMKaW5kZXggMDIyMWE1MC4uYWQ4Y2JiNyAxMDA2NDQKLS0tIGEva2VybmVsL3Byb2ZpbGUuYworKysgYi9rZXJuZWwvcHJvZmlsZS5jCkBAIC00OSwxNSArNDksMTkgQEAKIAogc3RhdGljIGludCBfX2luaXQgcHJvZmlsZV9zZXR1cChjaGFyICogc3RyKQogeworCXN0YXRpYyBjaGFyIF9faW5pdGRhdGEgc2NoZWRzdHJbXSA9ICJzY2hlZHVsZSI7CiAJaW50IHBhcjsKIAotCWlmICghc3RybmNtcChzdHIsICJzY2hlZHVsZSIsIDgpKSB7CisJaWYgKCFzdHJuY21wKHN0ciwgc2NoZWRzdHIsIHN0cmxlbihzY2hlZHN0cikpKSB7CiAJCXByb2Zfb24gPSBTQ0hFRF9QUk9GSUxJTkc7Ci0JCXByaW50ayhLRVJOX0lORk8gImtlcm5lbCBzY2hlZHVsZSBwcm9maWxpbmcgZW5hYmxlZFxuIik7Ci0JCWlmIChzdHJbN10gPT0gJywnKQotCQkJc3RyICs9IDg7Ci0JfQotCWlmIChnZXRfb3B0aW9uKCZzdHIsJnBhcikpIHsKKwkJaWYgKHN0cltzdHJsZW4oc2NoZWRzdHIpXSA9PSAnLCcpCisJCQlzdHIgKz0gc3RybGVuKHNjaGVkc3RyKSArIDE7CisJCWlmIChnZXRfb3B0aW9uKCZzdHIsICZwYXIpKQorCQkJcHJvZl9zaGlmdCA9IHBhcjsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJImtlcm5lbCBzY2hlZHVsZSBwcm9maWxpbmcgZW5hYmxlZCAoc2hpZnQ6ICVsZClcbiIsCisJCQlwcm9mX3NoaWZ0KTsKKwl9IGVsc2UgaWYgKGdldF9vcHRpb24oJnN0ciwgJnBhcikpIHsKIAkJcHJvZl9zaGlmdCA9IHBhcjsKIAkJcHJvZl9vbiA9IENQVV9QUk9GSUxJTkc7CiAJCXByaW50ayhLRVJOX0lORk8gImtlcm5lbCBwcm9maWxpbmcgZW5hYmxlZCAoc2hpZnQ6ICVsZClcbiIsCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDBkYzMxNTguLjY2YjJlZDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC00MjQzLDcgKzQyNDMsNyBAQAogCiAJLyogTm8gbW9yZSBNci4gTmljZSBHdXkuICovCiAJaWYgKGRlc3RfY3B1ID09IE5SX0NQVVMpIHsKLQkJdHNrLT5jcHVzX2FsbG93ZWQgPSBjcHVzZXRfY3B1c19hbGxvd2VkKHRzayk7CisJCWNwdXNfc2V0YWxsKHRzay0+Y3B1c19hbGxvd2VkKTsKIAkJZGVzdF9jcHUgPSBhbnlfb25saW5lX2NwdSh0c2stPmNwdXNfYWxsb3dlZCk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4ZjNkZWJjLi5iM2MyNGM3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC01MjIsNyArNTIyLDE2IEBACiB7CiAJaW50IHNpZyA9IDA7CiAKLQlzaWcgPSBuZXh0X3NpZ25hbChwZW5kaW5nLCBtYXNrKTsKKwkvKiBTSUdLSUxMIG11c3QgaGF2ZSBwcmlvcml0eSwgb3RoZXJ3aXNlIGl0IGlzIHF1aXRlIGVhc3kKKwkgKiB0byBjcmVhdGUgYW4gdW5raWxsYWJsZSBwcm9jZXNzLCBzZW5kaW5nIHNpZyA8IFNJR0tJTEwKKwkgKiB0byBzZWxmICovCisJaWYgKHVubGlrZWx5KHNpZ2lzbWVtYmVyKCZwZW5kaW5nLT5zaWduYWwsIFNJR0tJTEwpKSkgeworCQlpZiAoIXNpZ2lzbWVtYmVyKG1hc2ssIFNJR0tJTEwpKQorCQkJc2lnID0gU0lHS0lMTDsKKwl9CisKKwlpZiAobGlrZWx5KCFzaWcpKQorCQlzaWcgPSBuZXh0X3NpZ25hbChwZW5kaW5nLCBtYXNrKTsKIAlpZiAoc2lnKSB7CiAJCWlmIChjdXJyZW50LT5ub3RpZmllcikgewogCQkJaWYgKHNpZ2lzbWVtYmVyKGN1cnJlbnQtPm5vdGlmaWVyX21hc2ssIHNpZykpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zcGlubG9jay5jIGIva2VybmVsL3NwaW5sb2NrLmMKaW5kZXggZTE1ZWQxNy4uMGMzZjlkOCAxMDA2NDQKLS0tIGEva2VybmVsL3NwaW5sb2NrLmMKKysrIGIva2VybmVsL3NwaW5sb2NrLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogdm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9ja19iaChzcGlubG9ja190ICpsb2NrKQogewogCV9yYXdfc3Bpbl91bmxvY2sobG9jayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9zcGluX3VubG9ja19iaCk7CkBAIC0zMTgsNyArMzE4LDcgQEAKIHZvaWQgX19sb2NrZnVuYyBfcmVhZF91bmxvY2tfYmgocndsb2NrX3QgKmxvY2spCiB7CiAJX3Jhd19yZWFkX3VubG9jayhsb2NrKTsKLQlwcmVlbXB0X2VuYWJsZSgpOworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0woX3JlYWRfdW5sb2NrX2JoKTsKQEAgLTM0Miw3ICszNDIsNyBAQAogdm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfYmgocndsb2NrX3QgKmxvY2spCiB7CiAJX3Jhd193cml0ZV91bmxvY2sobG9jayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MKF93cml0ZV91bmxvY2tfYmgpOwpAQCAtMzU0LDcgKzM1NCw3IEBACiAJaWYgKF9yYXdfc3Bpbl90cnlsb2NrKGxvY2spKQogCQlyZXR1cm4gMTsKIAotCXByZWVtcHRfZW5hYmxlKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDQ3MjYzYWMuLjFkMzNmZWMgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAJCWlmIChwb3MgPCBzaXplKSB7CiAJCQlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKFJFQUQsIGlvY2IsCiAJCQkJCQlpb3YsIHBvcywgbnJfc2Vncyk7Ci0JCQlpZiAocmV0dmFsID49IDAgJiYgIWlzX3N5bmNfa2lvY2IoaW9jYikpCisJCQlpZiAocmV0dmFsID4gMCAmJiAhaXNfc3luY19raW9jYihpb2NiKSkKIAkJCQlyZXR2YWwgPSAtRUlPQ0JRVUVVRUQ7CiAJCQlpZiAocmV0dmFsID4gMCkKIAkJCQkqcHBvcyA9IHBvcyArIHJldHZhbDsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggNmJhZDRjNC4uZDIwOWY3NCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTE3MDEsMTIgKzE3MDEsMTMgQEAKIAlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXBhZ2VfdGFibGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOwogCWlmICh1bmxpa2VseSghcHRlX3NhbWUoKnBhZ2VfdGFibGUsIG9yaWdfcHRlKSkpIHsKLQkJcHRlX3VubWFwKHBhZ2VfdGFibGUpOwotCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXJldCA9IFZNX0ZBVUxUX01JTk9SOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfbm9tYXA7CisJfQorCisJaWYgKHVubGlrZWx5KCFQYWdlVXB0b2RhdGUocGFnZSkpKSB7CisJCXJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKKwkJZ290byBvdXRfbm9tYXA7CiAJfQogCiAJLyogVGhlIHBhZ2UgaXNuJ3QgcHJlc2VudCB5ZXQsIGdvIGFoZWFkIHdpdGggdGhlIGZhdWx0LiAqLwpAQCAtMTc0MSw2ICsxNzQyLDEyIEBACiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogb3V0OgogCXJldHVybiByZXQ7CitvdXRfbm9tYXA6CisJcHRlX3VubWFwKHBhZ2VfdGFibGUpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJZ290byBvdXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggMDFmOTc5My4uZGU1NGFjZCAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMTI0NCw3ICsxMjQ0LDcgQEAKIAlhZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKIAogCS8qIG1ha2Ugc3VyZSBpdCBjYW4gZml0IGluIHRoZSByZW1haW5pbmcgYWRkcmVzcyBzcGFjZSAqLwotCWlmIChhZGRyID49IGxlbikgeworCWlmIChhZGRyID4gbGVuKSB7CiAJCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyLWxlbik7CiAJCWlmICghdm1hIHx8IGFkZHIgPD0gdm1hLT52bV9zdGFydCkKIAkJCS8qIHJlbWVtYmVyIHRoZSBhZGRyZXNzIGFzIGEgaGludCBmb3IgbmV4dCB0aW1lICovCkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogCiAJCS8qIHRyeSBqdXN0IGJlbG93IHRoZSBjdXJyZW50IHZtYS0+dm1fc3RhcnQgKi8KIAkJYWRkciA9IHZtYS0+dm1fc3RhcnQtbGVuOwotCX0gd2hpbGUgKGxlbiA8PSB2bWEtPnZtX3N0YXJ0KTsKKwl9IHdoaWxlIChsZW4gPCB2bWEtPnZtX3N0YXJ0KTsKIAogCS8qCiAJICogQSBmYWlsZWQgbW1hcCgpIHZlcnkgbGlrZWx5IGNhdXNlcyBhcHBsaWNhdGlvbiBmYWlsdXJlLApAQCAtMTMwMiwzNyArMTMwMiw0MCBAQAogZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCXVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgcmV0OwogCi0JCWlmIChhZGRyID4gVEFTS19TSVpFIC0gbGVuKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWlmIChhZGRyICYgflBBR0VfTUFTSykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZmlsZSAmJiBpc19maWxlX2h1Z2VwYWdlcyhmaWxlKSkgIHsKLQkJCS8qCi0JCQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gcmFuZ2UgaXMgaHVnZXBhZ2UgYWxpZ25lZCwgYW5kCi0JCQkgKiBjYW4gYmUgbWFkZSBzdWl0YWJsZSBmb3IgaHVnZXBhZ2VzLgotCQkJICovCi0JCQlyZXQgPSBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKGFkZHIsIGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogRW5zdXJlIHRoYXQgYSBub3JtYWwgcmVxdWVzdCBpcyBub3QgZmFsbGluZyBpbiBhCi0JCQkgKiByZXNlcnZlZCBodWdlcGFnZSByYW5nZS4gIEZvciBzb21lIGFyY2hzIGxpa2UgSUEtNjQsCi0JCQkgKiB0aGVyZSBpcyBhIHNlcGFyYXRlIHJlZ2lvbiBmb3IgaHVnZXBhZ2VzLgotCQkJICovCi0JCQlyZXQgPSBpc19odWdlcGFnZV9vbmx5X3JhbmdlKGN1cnJlbnQtPm1tLCBhZGRyLCBsZW4pOwotCQl9Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIGFkZHI7CisJaWYgKCEoZmxhZ3MgJiBNQVBfRklYRUQpKSB7CisJCXVuc2lnbmVkIGxvbmcgKCpnZXRfYXJlYSkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKKwkJZ2V0X2FyZWEgPSBjdXJyZW50LT5tbS0+Z2V0X3VubWFwcGVkX2FyZWE7CisJCWlmIChmaWxlICYmIGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWEpCisJCQlnZXRfYXJlYSA9IGZpbGUtPmZfb3AtPmdldF91bm1hcHBlZF9hcmVhOworCQlhZGRyID0gZ2V0X2FyZWEoZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOworCQlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKQorCQkJcmV0dXJuIGFkZHI7CiAJfQogCi0JaWYgKGZpbGUgJiYgZmlsZS0+Zl9vcCAmJiBmaWxlLT5mX29wLT5nZXRfdW5tYXBwZWRfYXJlYSkKLQkJcmV0dXJuIGZpbGUtPmZfb3AtPmdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwKLQkJCQkJCXBnb2ZmLCBmbGFncyk7Ci0KLQlyZXR1cm4gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKKwlpZiAoYWRkciA+IFRBU0tfU0laRSAtIGxlbikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZHIgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmlsZSAmJiBpc19maWxlX2h1Z2VwYWdlcyhmaWxlKSkgIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGdpdmVuIHJhbmdlIGlzIGh1Z2VwYWdlIGFsaWduZWQsIGFuZAorCQkgKiBjYW4gYmUgbWFkZSBzdWl0YWJsZSBmb3IgaHVnZXBhZ2VzLgorCQkgKi8KKwkJcmV0ID0gcHJlcGFyZV9odWdlcGFnZV9yYW5nZShhZGRyLCBsZW4pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IGEgbm9ybWFsIHJlcXVlc3QgaXMgbm90IGZhbGxpbmcgaW4gYQorCQkgKiByZXNlcnZlZCBodWdlcGFnZSByYW5nZS4gIEZvciBzb21lIGFyY2hzIGxpa2UgSUEtNjQsCisJCSAqIHRoZXJlIGlzIGEgc2VwYXJhdGUgcmVnaW9uIGZvciBodWdlcGFnZXMuCisJCSAqLworCQlyZXQgPSBpc19odWdlcGFnZV9vbmx5X3JhbmdlKGN1cnJlbnQtPm1tLCBhZGRyLCBsZW4pOworCX0KKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYWRkcjsKIH0KIAogRVhQT1JUX1NZTUJPTChnZXRfdW5tYXBwZWRfYXJlYSk7CmRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jCmluZGV4IDBkZDdhY2UuLmVjNzIzOGEgMTAwNjQ0Ci0tLSBhL21tL21yZW1hcC5jCisrKyBiL21tL21yZW1hcC5jCkBAIC0yMjQsNiArMjI0LDEyIEBACiAJCQlzcGxpdCA9IDE7CiAJfQogCisJLyoKKwkgKiBpZiB3ZSBmYWlsZWQgdG8gbW92ZSBwYWdlIHRhYmxlcyB3ZSBzdGlsbCBkbyB0b3RhbF92bSBpbmNyZW1lbnQKKwkgKiBzaW5jZSBkb19tdW5tYXAoKSB3aWxsIGRlY3JlbWVudCBpdCBieSBvbGRfbGVuID09IG5ld19sZW4KKwkgKi8KKwltbS0+dG90YWxfdm0gKz0gbmV3X2xlbiA+PiBQQUdFX1NISUZUOworCiAJaWYgKGRvX211bm1hcChtbSwgb2xkX2FkZHIsIG9sZF9sZW4pIDwgMCkgewogCQkvKiBPT006IHVuYWJsZSB0byBzcGxpdCB2bWEsIGp1c3QgZ2V0IGFjY291bnRzIHJpZ2h0ICovCiAJCXZtX3VuYWNjdF9tZW1vcnkoZXhjZXNzID4+IFBBR0VfU0hJRlQpOwpAQCAtMjM3LDcgKzI0Myw2IEBACiAJCQl2bWEtPnZtX25leHQtPnZtX2ZsYWdzIHw9IFZNX0FDQ09VTlQ7CiAJfQogCi0JbW0tPnRvdGFsX3ZtICs9IG5ld19sZW4gPj4gUEFHRV9TSElGVDsKIAlfX3ZtX3N0YXRfYWNjb3VudChtbSwgdm1hLT52bV9mbGFncywgdm1hLT52bV9maWxlLCBuZXdfbGVuPj5QQUdFX1NISUZUKTsKIAlpZiAodm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHsKIAkJbW0tPmxvY2tlZF92bSArPSBuZXdfbGVuID4+IFBBR0VfU0hJRlQ7CmRpZmYgLS1naXQgYS9tbS9ub21tdS5jIGIvbW0vbm9tbXUuYwppbmRleCBiMjkzZWMxLi5jNTNlOWM4IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTE1MCw3ICsxNTAsOCBAQAogCWtmcmVlKGFkZHIpOwogfQogCi12b2lkICpfX3ZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpCit2b2lkICpfX3ZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssCisJCQlwZ3Byb3RfdCBwcm90KQogewogCS8qCiAJICoga21hbGxvYyBkb2Vzbid0IGxpa2UgX19HRlBfSElHSE1FTSBmb3Igc29tZSByZWFzb24KZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCAzNzhkZTIzLi45ODI3NDA5IDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC01ODYsNyArNTg2LDcgQEAKIAkJZGVjX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKIAl9CiAKLQlpbmNfbW1fY291bnRlcihtbSwgcnNzKTsKKwlkZWNfbW1fY291bnRlcihtbSwgcnNzKTsKIAlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIApAQCAtNjI2LDcgKzYyNiw3IEBACiAJcGdkX3QgKnBnZDsKIAlwdWRfdCAqcHVkOwogCXBtZF90ICpwbWQ7Ci0JcHRlX3QgKnB0ZTsKKwlwdGVfdCAqcHRlLCAqb3JpZ2luYWxfcHRlOwogCXB0ZV90IHB0ZXZhbDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CkBAIC02NTgsNyArNjU4LDcgQEAKIAlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlmb3IgKHB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcyk7CisJZm9yIChvcmlnaW5hbF9wdGUgPSBwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOwogCQkJYWRkcmVzcyA8IGVuZDsgcHRlKyssIGFkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CiAKIAkJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSkKQEAgLTY5NCw3ICs2OTQsNyBAQAogCQkoKm1hcGNvdW50KS0tOwogCX0KIAotCXB0ZV91bm1hcChwdGUpOworCXB0ZV91bm1hcChvcmlnaW5hbF9wdGUpOwogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBhNjBlMDA3Li5kYTQ4NDA1IDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJV0FSTl9PTihwYWdlX2NvdW50KHBhZ2UpIDw9IDEpOwogCiAJCWJkaSA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JCWJkaS0+dW5wbHVnX2lvX2ZuKGJkaSwgcGFnZSk7CisJCWJsa19ydW5fYmFja2luZ19kZXYoYmRpLCBwYWdlKTsKIAl9CiAJdXBfcmVhZCgmc3dhcF91bnBsdWdfc2VtKTsKIH0KZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCAyYmQ4M2U1Li44ZmYxNmExIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0yNDgsNiArMjQ4LDI4IEBACiAJcmV0dXJuIF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgZmxhZ3MsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5EKTsKIH0KIAorLyogQ2FsbGVyIG11c3QgaG9sZCB2bWxpc3RfbG9jayAqLworc3RydWN0IHZtX3N0cnVjdCAqX19yZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wOworCisJZm9yIChwID0gJnZtbGlzdCA7ICh0bXAgPSAqcCkgIT0gTlVMTCA7cCA9ICZ0bXAtPm5leHQpIHsKKwkJIGlmICh0bXAtPmFkZHIgPT0gYWRkcikKKwkJCSBnb3RvIGZvdW5kOworCX0KKwlyZXR1cm4gTlVMTDsKKworZm91bmQ6CisJdW5tYXBfdm1fYXJlYSh0bXApOworCSpwID0gdG1wLT5uZXh0OworCisJLyoKKwkgKiBSZW1vdmUgdGhlIGd1YXJkIHBhZ2UuCisJICovCisJdG1wLT5zaXplIC09IFBBR0VfU0laRTsKKwlyZXR1cm4gdG1wOworfQorCiAvKioKICAqCXJlbW92ZV92bV9hcmVhICAtICBmaW5kIGFuZCByZW1vdmUgYSBjb250aW5nb3VzIGtlcm5lbCB2aXJ0dWFsIGFyZWEKICAqCkBAIC0yNTUsMzAgKzI3NywxNSBAQAogICoKICAqCVNlYXJjaCBmb3IgdGhlIGtlcm5lbCBWTSBhcmVhIHN0YXJ0aW5nIGF0IEBhZGRyLCBhbmQgcmVtb3ZlIGl0LgogICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmb3VuZCBWTSBhcmVhLCBidXQgdXNpbmcgaXQgaXMgTk9UIHNhZmUKLSAqCW9uIFNNUCBtYWNoaW5lcy4KKyAqCW9uIFNNUCBtYWNoaW5lcywgZXhjZXB0IGZvciBpdHMgc2l6ZSBvciBmbGFncy4KICAqLwogc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcikKIHsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKLQorCXN0cnVjdCB2bV9zdHJ1Y3QgKnY7CiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCWZvciAocCA9ICZ2bWxpc3QgOyAodG1wID0gKnApICE9IE5VTEwgO3AgPSAmdG1wLT5uZXh0KSB7Ci0JCSBpZiAodG1wLT5hZGRyID09IGFkZHIpCi0JCQkgZ290byBmb3VuZDsKLQl9CisJdiA9IF9fcmVtb3ZlX3ZtX2FyZWEoYWRkcik7CiAJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7Ci0JcmV0dXJuIE5VTEw7Ci0KLWZvdW5kOgotCXVubWFwX3ZtX2FyZWEodG1wKTsKLQkqcCA9IHRtcC0+bmV4dDsKLQl3cml0ZV91bmxvY2soJnZtbGlzdF9sb2NrKTsKLQotCS8qCi0JICogUmVtb3ZlIHRoZSBndWFyZCBwYWdlLgotCSAqLwotCXRtcC0+c2l6ZSAtPSBQQUdFX1NJWkU7Ci0JcmV0dXJuIHRtcDsKKwlyZXR1cm4gdjsKIH0KIAogdm9pZCBfX3Z1bm1hcCh2b2lkICphZGRyLCBpbnQgZGVhbGxvY2F0ZV9wYWdlcykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZGFlYmQ5My4uNzYwZGM4MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTQ5MCw2ICs0OTAsMTQgQEAKIAkJCS8qIFBhcnRpYWxseSBjbG9uZWQgc2tiPyAqLwogCQkJaWYgKHNrYl9zaGFyZWQoZnJhZykpCiAJCQkJZ290byBzbG93X3BhdGg7CisKKwkJCUJVR19PTihmcmFnLT5zayk7CisJCQlpZiAoc2tiLT5zaykgeworCQkJCXNvY2tfaG9sZChza2ItPnNrKTsKKwkJCQlmcmFnLT5zayA9IHNrYi0+c2s7CisJCQkJZnJhZy0+ZGVzdHJ1Y3RvciA9IHNvY2tfd2ZyZWU7CisJCQkJc2tiLT50cnVlc2l6ZSAtPSBmcmFnLT50cnVlc2l6ZTsKKwkJCX0KIAkJfQogCiAJCS8qIEV2ZXJ5dGhpbmcgaXMgT0suIEdlbmVyYXRlISAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c194bWl0LmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBmYWE2MTc2Li5kZTIxZGEwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYwpAQCAtNTA4LDcgKzUwOCw2IEBACiAJCQlyYyA9IE5GX0FDQ0VQVDsKIAkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCiAJCWF0b21pY19pbmMoJmNwLT5pbl9wa3RzKTsKLQkJX19pcF92c19jb25uX3B1dChjcCk7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwppbmRleCAyOGQ5NDI1Li4wOWU4MjQ2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwpAQCAtOTQwLDM3ICs5NDAsMjUgQEAKIHN0cnVjdCBza19idWZmICoKIGlwX2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcikKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAl1bnNpZ25lZCBpbnQgb2xkZGVidWcgPSBza2ItPm5mX2RlYnVnOwogI2VuZGlmCiAKLQlpZiAoc2spIHsKLQkJc29ja19ob2xkKHNrKTsKLQkJc2tiX29ycGhhbihza2IpOwotCX0KKwlza2Jfb3JwaGFuKHNrYik7CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7IAogCXNrYiA9IGlwX2RlZnJhZyhza2IsIHVzZXIpOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCi0JaWYgKCFza2IpIHsKLQkJaWYgKHNrKQotCQkJc29ja19wdXQoc2spOwotCQlyZXR1cm4gc2tiOwotCX0KLQotCWlmIChzaykgewotCQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7Ci0JCXNvY2tfcHV0KHNrKTsKLQl9Ci0KLQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKLQlza2ItPm5mY2FjaGUgfD0gTkZDX0FMVEVSRUQ7CisJaWYgKHNrYikgeworCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwkJc2tiLT5uZmNhY2hlIHw9IE5GQ19BTFRFUkVEOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKLQkvKiBQYWNrZXQgcGF0aCBhcyBpZiBub3RoaW5nIGhhZCBoYXBwZW5lZC4gKi8KLQlza2ItPm5mX2RlYnVnID0gb2xkZGVidWc7CisJCS8qIFBhY2tldCBwYXRoIGFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAqLworCQlza2ItPm5mX2RlYnVnID0gb2xkZGVidWc7CiAjZW5kaWYKKwl9CisKIAlyZXR1cm4gc2tiOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDc5ODM1YTYuLjViYWQ1MDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC00MzU1LDE2ICs0MzU1LDcgQEAKIAkJCQkJZ290byBub19hY2s7CiAJCQl9CiAKLQkJCWlmIChlYXRlbikgewotCQkJCWlmICh0Y3BfaW5fcXVpY2thY2tfbW9kZSh0cCkpIHsKLQkJCQkJdGNwX3NlbmRfYWNrKHNrKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0Y3Bfc2VuZF9kZWxheWVkX2Fjayhzayk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlfX3RjcF9hY2tfc25kX2NoZWNrKHNrLCAwKTsKLQkJCX0KLQorCQkJX190Y3BfYWNrX3NuZF9jaGVjayhzaywgMCk7CiBub19hY2s6CiAJCQlpZiAoZWF0ZW4pCiAJCQkJX19rZnJlZV9za2Ioc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAwZjA3MTE0Li5iNzhhNTM1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC01NTIsMTMgKzU1MiwxNyBAQAogCQkJICAgIHNrYl9oZWFkcm9vbShmcmFnKSA8IGhsZW4pCiAJCQkgICAgZ290byBzbG93X3BhdGg7CiAKLQkJCS8qIENvcnJlY3Qgc29ja2V0IG93bmVyc2hpcC4gKi8KLQkJCWlmIChmcmFnLT5zayA9PSBOVUxMKQotCQkJCWdvdG8gc2xvd19wYXRoOwotCiAJCQkvKiBQYXJ0aWFsbHkgY2xvbmVkIHNrYj8gKi8KIAkJCWlmIChza2Jfc2hhcmVkKGZyYWcpKQogCQkJCWdvdG8gc2xvd19wYXRoOworCisJCQlCVUdfT04oZnJhZy0+c2spOworCQkJaWYgKHNrYi0+c2spIHsKKwkJCQlzb2NrX2hvbGQoc2tiLT5zayk7CisJCQkJZnJhZy0+c2sgPSBza2ItPnNrOworCQkJCWZyYWctPmRlc3RydWN0b3IgPSBzb2NrX3dmcmVlOworCQkJCXNrYi0+dHJ1ZXNpemUgLT0gZnJhZy0+dHJ1ZXNpemU7CisJCQl9CiAJCX0KIAogCQllcnIgPSAwOwpAQCAtMTExNiwxMiArMTEyMCwxMCBAQAogCQl0YWlsX3NrYiA9ICYodG1wX3NrYi0+bmV4dCk7CiAJCXNrYi0+bGVuICs9IHRtcF9za2ItPmxlbjsKIAkJc2tiLT5kYXRhX2xlbiArPSB0bXBfc2tiLT5sZW47Ci0jaWYgMCAvKiBMb2dpY2FsbHkgY29ycmVjdCwgYnV0IHVzZWxlc3Mgd29yaywgaXBfZnJhZ21lbnQoKSB3aWxsIGhhdmUgdG8gdW5kbyAqLwogCQlza2ItPnRydWVzaXplICs9IHRtcF9za2ItPnRydWVzaXplOwogCQlfX3NvY2tfcHV0KHRtcF9za2ItPnNrKTsKIAkJdG1wX3NrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CiAJCXRtcF9za2ItPnNrID0gTlVMTDsKLSNlbmRpZgogCX0KIAogCWlwdjZfYWRkcl9jb3B5KGZpbmFsX2RzdCwgJmZsLT5mbDZfZHN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X291dHB1dC5jIGIvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKaW5kZXggNjAxYTE0OC4uNmI5ODY3NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKQEAgLTg0LDYgKzg0LDcgQEAKIAkJbXR1ID0gSVBWNl9NSU5fTVRVOwogCiAJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCXNrYi0+ZGV2ID0gZHN0LT5kZXY7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOwogCQlyZXQgPSAtRU1TR1NJWkU7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IDczM2JmNTIuLmU0MWNlNDUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTczNSwxMSArNzM1LDE1IEBACiAKIAlzb2NrX2hvbGQoc2spOwogCWlmIChwLT5za2IyID09IE5VTEwpIHsKLQkJaWYgKGF0b21pY19yZWFkKCZwLT5za2ItPnVzZXJzKSAhPSAxKSB7CisJCWlmIChza2Jfc2hhcmVkKHAtPnNrYikpIHsKIAkJCXAtPnNrYjIgPSBza2JfY2xvbmUocC0+c2tiLCBwLT5hbGxvY2F0aW9uKTsKIAkJfSBlbHNlIHsKLQkJCXAtPnNrYjIgPSBwLT5za2I7Ci0JCQlhdG9taWNfaW5jKCZwLT5za2ItPnVzZXJzKTsKKwkJCXAtPnNrYjIgPSBza2JfZ2V0KHAtPnNrYik7CisJCQkvKgorCQkJICogc2tiIG93bmVyc2hpcCBtYXkgaGF2ZSBiZWVuIHNldCB3aGVuCisJCQkgKiBkZWxpdmVyZWQgdG8gYSBwcmV2aW91cyBzb2NrZXQuCisJCQkgKi8KKwkJCXNrYl9vcnBoYW4ocC0+c2tiMik7CiAJCX0KIAl9CiAJaWYgKHAtPnNrYjIgPT0gTlVMTCkgewpAQCAtNzg1LDExICs3ODksMTIgQEAKIAlza19mb3JfZWFjaF9ib3VuZChzaywgbm9kZSwgJm5sX3RhYmxlW3Nzay0+c2tfcHJvdG9jb2xdLm1jX2xpc3QpCiAJCWRvX29uZV9icm9hZGNhc3Qoc2ssICZpbmZvKTsKIAorCWtmcmVlX3NrYihza2IpOworCiAJbmV0bGlua191bmxvY2tfdGFibGUoKTsKIAogCWlmIChpbmZvLnNrYjIpCiAJCWtmcmVlX3NrYihpbmZvLnNrYjIpOwotCWtmcmVlX3NrYihza2IpOwogCiAJaWYgKGluZm8uZGVsaXZlcmVkKSB7CiAJCWlmIChpbmZvLmNvbmdlc3RlZCAmJiAoYWxsb2NhdGlvbiAmIF9fR0ZQX1dBSVQpKQpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGM0NzhmYzguLmM0MjBlYmEgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTc3MCwzMyArNzcwLDEyIEBACiAJCWVyciA9IHBhdGhfbG9va3VwKHN1bmFkZHItPnN1bl9wYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfbWtub2RfcGFyZW50OwotCQkvKgotCQkgKiBZdWNreSBsYXN0IGNvbXBvbmVudCBvciBubyBsYXN0IGNvbXBvbmVudCBhdCBhbGw/Ci0JCSAqIChmb28vLiwgZm9vLy4uLCAvLy8vLykKLQkJICovCi0JCWVyciA9IC1FRVhJU1Q7Ci0JCWlmIChuZC5sYXN0X3R5cGUgIT0gTEFTVF9OT1JNKQotCQkJZ290byBvdXRfbWtub2Q7Ci0JCS8qCi0JCSAqIExvY2sgdGhlIGRpcmVjdG9yeS4KLQkJICovCi0JCWRvd24oJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwotCQkvKgotCQkgKiBEbyB0aGUgZmluYWwgbG9va3VwLgotCQkgKi8KLQkJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5kLmxhc3QsIG5kLmRlbnRyeSk7CisKKwkJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOwogCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJCWdvdG8gb3V0X21rbm9kX3VubG9jazsKLQkJZXJyID0gLUVOT0VOVDsKLQkJLyoKLQkJICogU3BlY2lhbCBjYXNlIC0gbG9va3VwIGdhdmUgbmVnYXRpdmUsIGJ1dC4uLiB3ZSBoYWQgZm9vL2Jhci8KLQkJICogRnJvbSB0aGUgdmZzX21rbm9kKCkgUE9WIHdlIGp1c3QgaGF2ZSBhIG5lZ2F0aXZlIGRlbnRyeSAtCi0JCSAqIGFsbCBpcyBmaW5lLiBMZXQncyBiZSBiYXN0YXJkcyAtIHlvdSBoYWQgLyBvbiB0aGUgZW5kLCB5b3UndmUKLQkJICogYmVlbiBhc2tpbmcgZm9yIChub24tZXhpc3RlbnQpIGRpcmVjdG9yeS4gLUVOT0VOVCBmb3IgeW91LgotCQkgKi8KLQkJaWYgKG5kLmxhc3QubmFtZVtuZC5sYXN0Lmxlbl0gJiYgIWRlbnRyeS0+ZF9pbm9kZSkKLQkJCWdvdG8gb3V0X21rbm9kX2RwdXQ7CisKIAkJLyoKIAkJICogQWxsIHJpZ2h0LCBsZXQncyBjcmVhdGUgaXQuCiAJCSAqLwpAQCAtODQ1LDcgKzgyNCw2IEBACiAJZHB1dChkZW50cnkpOwogb3V0X21rbm9kX3VubG9jazoKIAl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7Ci1vdXRfbWtub2Q6CiAJcGF0aF9yZWxlYXNlKCZuZCk7CiBvdXRfbWtub2RfcGFyZW50OgogCWlmIChlcnI9PS1FRVhJU1QpCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2FsZ28uYyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCmluZGV4IDA4MGFhZTIuLjJmNDUzMWYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fYWxnby5jCisrKyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCkBAIC02OTgsNyArNjk4LDcgQEAKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAogCQkJaWYgKHNrYjEtPnNrKQotCQkJCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrYjEtPnNrKTsKKwkJCQlza2Jfc2V0X293bmVyX3coc2tiMiwgc2tiMS0+c2spOwogCiAJCQkvKiBMb29raW5nIGFyb3VuZC4gQXJlIHdlIHN0aWxsIGFsaXZlPwogCQkJICogT0ssIGxpbmsgbmV3IHNrYiwgZHJvcCBvbGQgb25lICovCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IDVkZGRhMmMuLjk3NTA5MDEgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0zNCwxNCArMzQsMjEgQEAKIHsKIAlzdHJ1Y3QgcnRhdHRyICpydCA9IHhmcm1hW3R5cGUgLSAxXTsKIAlzdHJ1Y3QgeGZybV9hbGdvICphbGdwOworCWludCBsZW47CiAKIAlpZiAoIXJ0KQogCQlyZXR1cm4gMDsKIAotCWlmICgocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgPCBzaXplb2YoKmFsZ3ApKQorCWxlbiA9IChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSAtIHNpemVvZigqYWxncCk7CisJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYWxncCA9IFJUQV9EQVRBKHJ0KTsKKworCWxlbiAtPSAoYWxncC0+YWxnX2tleV9sZW4gKyA3VSkgLyA4OyAKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFhGUk1BX0FMR19BVVRIOgogCQlpZiAoIWFsZ3AtPmFsZ19rZXlfbGVuICYmCkBAIC0xNjIsNiArMTY5LDcgQEAKIAlzdHJ1Y3QgcnRhdHRyICpydGEgPSB1X2FyZzsKIAlzdHJ1Y3QgeGZybV9hbGdvICpwLCAqdWFsZzsKIAlzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKmFsZ287CisJaW50IGxlbjsKIAogCWlmICghcnRhKQogCQlyZXR1cm4gMDsKQEAgLTE3MywxMSArMTgxLDEyIEBACiAJCXJldHVybiAtRU5PU1lTOwogCSpwcm9wcyA9IGFsZ28tPmRlc2Muc2FkYl9hbGdfaWQ7CiAKLQlwID0ga21hbGxvYyhzaXplb2YoKnVhbGcpICsgdWFsZy0+YWxnX2tleV9sZW4sIEdGUF9LRVJORUwpOworCWxlbiA9IHNpemVvZigqdWFsZykgKyAodWFsZy0+YWxnX2tleV9sZW4gKyA3VSkgLyA4OworCXAgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbWNweShwLCB1YWxnLCBzaXplb2YoKnVhbGcpICsgdWFsZy0+YWxnX2tleV9sZW4pOworCW1lbWNweShwLCB1YWxnLCBsZW4pOwogCSphbGdwcCA9IHA7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggNWE4MjBjZi4uODQ0OWQ2NiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtNDc2LDggKzQ3Niw4IEBACiAJaW50IHJjID0gMDsKIAogCWlmICghc3NfaW5pdGlhbGl6ZWQpIHsKLQkJYXZkLT5hbGxvd2VkID0gcmVxdWVzdGVkOwotCQlhdmQtPmRlY2lkZWQgPSByZXF1ZXN0ZWQ7CisJCWF2ZC0+YWxsb3dlZCA9IDB4ZmZmZmZmZmY7CisJCWF2ZC0+ZGVjaWRlZCA9IDB4ZmZmZmZmZmY7CiAJCWF2ZC0+YXVkaXRhbGxvdyA9IDA7CiAJCWF2ZC0+YXVkaXRkZW55ID0gMHhmZmZmZmZmZjsKIAkJYXZkLT5zZXFubyA9IGxhdGVzdF9ncmFudGluZzsKQEAgLTExOTYsOSArMTE5NiwxMSBAQAogCQl9CiAJCXBvbGljeWRiX2xvYWRlZF92ZXJzaW9uID0gcG9saWN5ZGIucG9saWN5dmVyczsKIAkJc3NfaW5pdGlhbGl6ZWQgPSAxOwotCisJCXNlcW5vID0gKytsYXRlc3RfZ3JhbnRpbmc7CiAJCUxPQURfVU5MT0NLOwogCQlzZWxpbnV4X2NvbXBsZXRlX2luaXQoKTsKKwkJYXZjX3NzX3Jlc2V0KHNlcW5vKTsKKwkJc2Vsbmxfbm90aWZ5X3BvbGljeWxvYWQoc2Vxbm8pOwogCQlyZXR1cm4gMDsKIAl9CiAK